ENote
  • ✨Home
    • Відмова від відповідальності
  • Progr
    • Python
      • Модулі
        • pip
        • cgitb
        • datetime
          • Класс datetime() модуля datetime
            • Методы объекта datetime.datetime()
            • datetime.datetime examples
          • Класс timedelta() модуля datetime
            • datetime.timedelta examples
          • Класс date() модуля datetime
            • datetime.date examples
          • Класс time() модуля datetime
            • Формат для функций .strftime() и .strptime(). модуля datetime
        • os.path
        • pathlib
          • pathlib to str
        • subproces
        • os
        • Jinja
          • Синтаксис шаблонів Jinja
          • Клас Environment()
          • Простой пример cgi-скрипта c Jinja-шаблоном
          • Создание переменных
            • Як оновити глобальну змінну зсередини оператора IF / ELSE або циклу FOR
          • Фільтри і методи
          • Число у рядок, slices
          • Вбудовані фільтри Jinja2
        • re
          • re.search - example
          • re.findall - example
        • email / smtplib
          • Как отправлять электронные письма с помощью Python
        • requests
          • Як зберегти та завантажити файли cookie в запитах Python?
          • Извлечение и установка cookies с модулем requests в Python
          • Links
        • http.cookies
          • Всё о работе с cookie в Python — класс http.cookies
        • xlrd
        • xlwt
        • borb
          • ChunkOfText
          • send_usage_statistics
          • borb clear
          • 2.1.3 vs 2.1.15
          • QR-code
          • Залежності borb
        • JSON
          • Кирилиця в JSON
        • matplotlib
        • argparse
        • click
        • configparser
        • traceback
        • sys
          • exit()
        • mysql-connector-python
        • logging
        • icrawler
        • Auto Plates
        • rembg
        • random
      • Strings
        • Built-in methods
        • Форматування виводу
        • Початкові нулі
        • Рядок в число
      • list
        • Об’єднання списків
        • list.sort(), sorted()
        • list.reverse(), reversed()
        • all(), any()
        • sum(), min(), max()
        • map(), filter(), reduce()
        • join(), split()
      • tuple
      • dict
        • Об'єднання / злиття словників
        • Сортування словника Python: значення, ключі тощо
      • set
      • class Enum
      • Середнє арифметичне
      • Virtual environment
        • web-app
      • type(), isinstance()
      • __main__
      • Files & Dirs
        • Try except for exception handling
        • Cписок файлов директории
        • User Home Dir
        • Copy file
      • *args, **qwargs
      • Links
      • Область видимости
      • Handling a File Error
      • assert
      • if
      • Числа
        • Округлення чисел
        • Отримати число з рядка
      • Обработка исключений в Python
      • Файлы и сериализация данных
      • OOP
      • Net and Web
      • Структура проекта на Python
      • Распаковка итерируемых объектов
      • Links
      • Algorithms
      • Python exit commands: quit(), exit(), sys.exit() and os._exit()
      • Цикли for / while
      • uuid
    • JavaScript
      • String
        • replaceAll() polyfill
        • Шаблонные строки
      • Array
        • Все способы перебора массива в JavaScript
      • Object
      • document.location
      • RegExp
      • Examples
        • Вычисление остатка от деления
        • Остаток от деления и деление без остатка
        • Округление числа
      • XMLHttpRequest
      • alert, prompt, confirm
      • onclick
      • hidden, display:none
      • LocalStorage, sessionStorage
      • null, undefined
      • cookies (js)
      • var, let и const
        • var vs let
        • const
      • Модифікація DOM
        • DOM select
      • JSON
        • Try
      • fetch
      • typeof
      • FormData не включає disabled набори полів
      • FormData, fdata
      • Більше одного відео YouTube на одній сторінці
    • HTML, CSS
      • favicon
      • Деякі спецсимволи
      • meta
      • ASCII table
      • lang
      • Псевдоелементи ::after і ::before
      • Cursor
      • Об использовании нестандартных пробелов
      • Картинка фоном
      • Безпечні веб-шрифти
      • Завжди внизу, незалежно від пропорцій екрану
      • напівпрозорий елемент
      • Символи з тінью
      • SVG (bootstrap)
      • rel = canonical
      • link stylesheet: integrity & crossorigin
      • rel = noopener
    • Bootstrap
      • Form Validate
      • Password show/hide
    • Errors
  • Dev
    • Git
      • clone
      • git-scm (book)
      • git config
        • files .git*
        • core.filemode
        • core.sharedRepository
      • .gitignore
      • .gitkeep
      • Видалити з репозиторію
        • Видалений файл з однієї гілки...
      • Пам’ятка
        • Перегляд історії комітів
        • Скасувати git add
        • revert
        • Скасувати внесені зміни у файл
        • Додати до коміту файл
        • Видалити історію попередніх коммітів, та почати "з нуля"
        • Додати файли в останній коміт
      • Робота з гілками
        • Порівняти гілки
      • Git за полчаса
      • Три розділи проєкту Git
      • Merge conflict
      • Pull error
        • Git Error: You have divergent branches...
      • diff
      • Video
      • Merge скасувати
      • .gitignore: Permission denied
    • GitHub
      • SSH-підключення до GitHub
      • Перенести на сервер локальный репозиторий
      • Перенести на сервер репозиторій разом з історією
      • Створення змісту
    • Security
      • robots.txt
      • Cookies
    • Аутентифікація і cookies
      • ChatGPT
  • data
    • MySQL
      • MyISAM vs InnoDB
      • Типи даних
        • NULL (todo)
        • TIMESTAMP
        • YEAR
        • JSON
        • Требования к памяти для символьных типов
        • Поиск записей в таблице, которым нет соответствия в другой
      • Приклад створення БД, та користувача
        • Права для пользователей
      • Переглянути всі індекси таблиці
      • Копіювання, клонування таблиць
      • TEMPORARY TABLE
      • JOIN
      • ALTER TABLE
      • AUTO_INCREMENT
        • AUTO_INCREMENT у складовому індексі
      • LIMIT
        • Использование MySQL LIMIT
      • 10 Примеров входной загрузки данных из текстового файла в таблицы MySQL
      • Рішення
        • Выявление и удаление несвязанных записей
        • Выборка произвольных записей
        • Коректне сортування українських літер
        • Найти записи, которые присутствуют в одной таблице и отсутствуют во второй
        • Как удобно посмотреть данные...
        • Нахождение "дыр" в нумерации
        • Знайти дубликати полів в одній таблиці
        • Дані колонки 1 табл. перенести в 2 табл.
      • Функції
        • LAST_INSERT_ID()
        • GROUP_CONCAT
        • COUNT + DISTINCT
        • Функции для работы с датами и временем
      • Автоматизируйте создание бэкапов
      • mysqldump
        • Time Zone UTC
      • Результат запиту у файл
      • Результат запиту у змінну
      • Пособие по MySQL на Python
      • Змінні
      • Эмуляция функции row_number() в MySQL
      • Изучаем хранимые процедуры MySQL
      • SELECT DISTINCT
      • Dump всієї бази даних
      • Індекси
      • FOREIGN KEY
      • MAX(), MIN()
      • LENGTH, CHAR_LENGTH
      • Встановлення
    • MariaDB
    • PostgreSQL
      • Работа с базой данных PostgreSQL
      • Работаем с PostgreSQL через командную строку в Linux
    • Domains
      • Життєвий цикл доменів
      • Статус домена
    • SQLite, MySQL и PostgreSQL: сравниваем популярные реляционные СУБД
  • Linux
    • DNS
      • Как в DNS прописать 301 редирект
      • mail
        • SPF
          • Mirohost
        • _dmarc _domainkey
        • DKIM
        • Прописати ключі DKIM в exim
        • Листи з неіснуючим адресатом
    • Server
      • Zomro
        • pip
        • SSH-доступ по ключу (zomro)
        • venv
        • UnicodeEncodeError: 'latin-1' codec can't encode character
        • Mail Ports
        • Редірект з SSL-сертификатом на транзитному сайті
        • Редірект з SSL за допомогою .htaccess
      • Створення нового користувача з привілеями sudo в Ubuntu
      • SSH-доступ по ключу
      • Часовий пояс в Ubuntu 20.04
      • SSH-підключення командний рядок
      • Як встановити Python 3.9 (нижчу) на Ubuntu 22.04
      • Автозагрузка сервисов в Ubuntu
      • Підвищення безпеки SSH
      • Ubuntu Server
        • Art 01
    • Commands
      • adduser
      • apt
      • cat
      • ls
      • tar
      • ln
      • find
      • chmod
      • chown
      • mv
      • dig
      • ping
      • passwd
      • htpasswd
      • umask
      • usermode
      • history
      • cmp
      • chattr +i
    • Config
      • Keyboard
      • windows
      • My kbdswtch
      • Затримка при завантаженні системи
      • Files
        • /etc/resolv.conf
        • /boot/grub/grub.cfg
        • .config/user-dir.dirs
        • /etc/fstab
      • Як встановити шрифти
    • Apache
      • Встановлення
      • Подключить виртуальный хост
      • Файл .htaccess
        • Установка индексного файла
        • Фільтр IP-адрес
        • ModRewrite
          • Заборонити доступ за User-Agent
          • Перенаправити на іншу сторінку
          • Додавати слеш до адреси
        • Включити SSI
        • Виконувати скрипти CGI
        • Тимчасовий перехід з одного домену на інший
      • SSI
      • SSL
      • Відключити старт Apache з системою
      • Помилки
        • Скрипт не працює
        • CGI-скрипт не виводить кирилицю
        • Could not reliably determine
        • Permissions are missing on a component of the path
        • Symbolic link not allowed or link target not accessible
      • AddType, AddLanguage, AddCharset
    • Nginx
      • 301 редирект з www. та http: на https://(без www.)domain
    • Soft
      • SublimeText
        • Plugins
      • Firefox
      • Gwenview
      • inkscape
      • Double Commander
      • nano
      • mc
        • Знайти потрібний файл
      • meld / diffuse
      • hexedit
      • Kazam - відео з екрану
      • VeraCrypt
      • XnView MP
      • LibreOffice
      • xdotool
      • System Load Monitor
      • Battery Monitor
      • qBittorrent
    • Перетворення .RPM в .DEB
    • Bash
      • Конкатенация строк в Bash
      • Page
    • Файлові часові позначки в Linux: atime, mtime, ctime
    • Права доступу для файлів і каталогів
    • Зміна паролю root
    • Быстро удалить огромное количество файлов в каталоге
    • Як узнати версію Linux?
    • USB Flash ext4
    • Clear Cache
    • Доступ до спільної папки на Windows
    • Віртуальні консолі TTY1–TTY6
    • APT. Заборона оновлення
  • Різне
    • GitBook
    • Банковское округление
    • Ім’я користувача Youtube
  • Hard
    • Hardware
      • Acer Extensa
      • Таймер Feron TM22
      • WD My Book World Edition 2Tb
        • FTP
        • SSH
          • Проблеми
        • SSHFS
      • Canon PIXMA E3340
      • Термометри
    • Auto
      • Акумулятор
    • Electro
    • USB Flash recovery
Powered by GitBook
On this page
  • Ключові відмінності
  • Що потрібно використовувати?
  • Що означають частини
  1. data
  2. MySQL
  3. Рішення

Коректне сортування українських літер

За замовчуванням MySQL сортує український алфавіт у такий спосіб: першими йдуть «Є, І, Ї», а потім «А, Б, В». Ми можемо виправити це використовуючі відповідні директиви при створенні таблиць: DEFAULT CHARSET і COLLATE.

Зараз MySQL переходить від старішої, недосконалої реалізації UTF-8. Наразі потрібно використовувати utf8mb4 замість utf8 для кодування символів, що і роблять останні версії. Версія з недоліками залишається для зворотної сумісності, хоча вона застаріла.

Ключові відмінності

  • utf8mb4_unicode_ci - базується на офіційних правилах Unicode для універсального сортування та порівняння, які точно сортують у широкому діапазоні мов.

  • utf8mb4_general_ci - (за замовчуванням) це спрощений набір правил сортування, який має на меті працювати якнайкраще, одночасно використовуючи багато скорочень, призначених для підвищення швидкості. Це не відповідає правилам Unicode і призведе до небажаного сортування або порівняння в деяких ситуаціях, наприклад, під час використання певних мов або символів.

На сучасних серверах це підвищення продуктивності буде майже незначним. Він був розроблений у той час, коли сервери мали незначну частку продуктивності ЦП, ніж сучасні комп’ютери.

Що потрібно використовувати?

Майже напевно немає причин для використання utf8mb4_general_ci, оскільки ми залишили позаду точку, коли швидкість ЦП є достатньо низькою, щоб різниця в продуктивності була важливою. Ваша база даних майже напевно буде обмежена іншими вузькими місцями, крім цього.

У минулому деякі люди рекомендували використовувати utf8mb4_general_ci за винятком випадків, коли точне сортування було достатньо важливим, щоб виправдати вартість продуктивності. Сьогодні ця вартість продуктивності майже зникла, і розробники більш серйозно ставляться до інтернаціоналізації.

Існує аргумент, що якщо швидкість для вас важливіша за точність, ви можете взагалі не виконувати сортування. Тривіально зробити алгоритм швидшим, якщо вам не потрібно, щоб він був точним. Отже, utf8mb4_general_ci це компроміс, який, ймовірно, не потрібен з причин швидкості та, ймовірно, також не підходить з причин точності.

Ще одна річ, яку я додам, полягає в тому, що навіть якщо ви знаєте, що ваша програма підтримує лише англійську мову, вона все одно може мати справу з іменами людей, які часто можуть містити символи, що використовуються в інших мовах, у яких так само важливо правильно сортувати . Використання правил Unicode для всього допомагає переконатися, що дуже розумні люди Unicode дуже багато працювали, щоб сортування працювало належним чином.

Що означають частини

По-перше, ci - для сортування та порівняння без урахування регістру . Це означає, що він підходить для текстових даних, і регістр не важливий. Інші типи порівняння cs (з урахуванням регістру) для текстових даних, де регістр важливий, і bin, коли кодування має збігатися, біт за біт, що підходить для полів, які дійсно є закодованими двійковими даними (включаючи, наприклад, Base64). Сортування з урахуванням регістру призводить до деяких дивних результатів, а порівняння з урахуванням регістру може призвести до повторюваних значень, що відрізняються лише регістром літер, тому порівняння з урахуванням регістру втрачає перевагу для текстових даних – якщо для вас важливий регістр, тоді пунктуацію можна не враховувати. і так далі, ймовірно, також є важливим, і двійкове зіставлення може бути більш доречним.

Далі unicode або general стосується конкретних правил сортування та порівняння, зокрема способу нормалізації чи порівняння тексту. Існує багато різних наборів правил для кодування символів utf8mb4, два з unicode яких general намагаються добре працювати на всіх можливих мовах, а не на одній конкретній. Відмінності між цими двома наборами правил є предметом цієї статті. Зауважте, що unicode використовує правила з Unicode 4.0. Останні версії MySQL і MariaDB додають набори правил unicode_520, використовуючи правила з Unicode 5.2, а MySQL 8.x додає 0900 (відкидаючи частину «unicode_»), використовуючи правила з Unicode 9.0.

І, нарешті, utf8mb4 кодування символів, яке використовується всередині. У цій відповіді я говорю лише про кодування на основі Unicode.

Тобто, щоб не мати проблем з сортуванням, таблиці слід створювати так:

CREATE TABLE `table1` (
...
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Якщо в таблиці нема інших даних ніж цифри та основні латинські літери, можна так:

CREATE TABLE `table2` (
...
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

це дасть приріст продуктивності, але дуже незначний.

В окремих випадках директиви можна призначати полям, нарпиклад:

CREATE TABLE test (name CHAR(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci);
> select name from test;
+------------------+
| name             |
+------------------+
| Петро            |
| Василь           |
| Їбобо            |
| Микола           |
| Єва              |
| Сашко            |
| Івасик           |
| Наталка          |
| Андрійко         |
| Андрєйко         |
| Андрїйко         |
+------------------+

> select name from test order by name;
+------------------+
| name             |
+------------------+
| Андрєйко         |
| Андрійко         |
| Андрїйко         |
| Василь           |
| Єва              |
| Івасик           |
| Їбобо            |
| Микола           |
| Наталка          |
| Петро            |
| Сашко            |
+------------------+
PreviousВыборка произвольных записейNextНайти записи, которые присутствуют в одной таблице и отсутствуют во второй

Last updated 2 years ago

https://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci