Что означает набор символов и сопоставление?

Я могу прочитать документацию по MySQL, и это довольно ясно. Но как решить, какой набор символов использовать? На какие данные влияет сопоставление?

Я прошу объяснения двух и как их выбрать.

4 ответа

Решение

Из документов MySQL:

Набор символов - это набор символов и кодировок. Сличение - это набор правил для сравнения символов в наборе символов. Давайте проясним это различие на примере воображаемого набора символов.

Предположим, что у нас есть алфавит с четырьмя буквами: "A", "B", "a", "b". Каждой букве мы присваиваем число: "A" = 0, "B" = 1, "a" = 2, "b" = 3. Буква "A" - это символ, цифра "0" - это кодировка "A". и комбинация всех четырех букв и их кодировок является набором символов.

Теперь предположим, что мы хотим сравнить два строковых значения: "A" и "B". Самый простой способ сделать это - посмотреть на кодировки: 0 для "A" и 1 для "B". Поскольку 0 меньше 1, мы говорим "А" меньше, чем "В". Теперь, что мы только что сделали - применили сопоставление к нашему набору символов. Сортировка - это набор правил (в данном случае только одно правило): "сравни кодировки". Мы называем это самое простое из всех возможных сопоставлений двоичным сопоставлением.

Но что, если мы хотим сказать, что строчные и прописные буквы эквивалентны? Тогда у нас было бы как минимум два правила: (1) обрабатывать строчные буквы "a" и "b" как эквивалентные "A" и "B"; (2) затем сравните кодировки. Мы называем это сопоставлением без учета регистра. Это немного сложнее, чем двоичное сопоставление.

В реальной жизни большинство наборов символов имеют много символов: не только "A" и "B", но и целые алфавиты, иногда несколько алфавитов или восточные письменные системы с тысячами символов, а также множество специальных символов и знаков препинания. Также в реальной жизни большинство сопоставлений имеют много правил: не только нечувствительность к регистру, но и нечувствительность к акценту ("акцент" - это знак, прикрепленный к символу, как в немецком "ö") и сопоставления с несколькими символами (например, правило, которое " ö' = 'OE'в одном из двух немецких сопоставлений).

Кодировка символов - это способ кодирования символов так, чтобы они помещались в памяти. То есть, если кодировка соответствует ISO-8859-15, символ евро € будет закодирован как 0xa4, а в UTF-8 это будет 0xe282ac.

Сортировка состоит в том, как сравнивать символы, в латинице 9 есть буквы как e é è ê f, если отсортировано по бинарному представлению, оно пойдет e f é ê è но если для сортировки установлено, например, французское, вы будете иметь их в том порядке, в котором, как вы думали, они будут, e é è ê равны, а затем f,

Набор символов является подмножеством всех написанных глифов. Кодировка символов определяет, как эти символы отображаются в числовые значения. Некоторые кодировки символов, такие как UTF-8 и UTF-16, могут кодировать любой символ в универсальном наборе символов. Другие, такие как US-ASCII или ISO-8859-1, могут кодировать только небольшое подмножество, поскольку они используют 7 и 8 бит на символ, соответственно. Поскольку многие стандарты определяют как набор символов, так и кодировку символов, термин "набор символов" часто свободно заменяется термином "кодировка символов".

Сортировка включает в себя правила, которые определяют, как символы могут сравниваться для сортировки. Правила сопоставления могут зависеть от конкретной локали: правильный порядок двух символов варьируется от языка к языку.

Выбор набора символов и параметров сортировки зависит от того, является ли ваше приложение интернационализированным или нет. Если нет, на какую локацию вы ориентируетесь?

Чтобы выбрать набор символов, который вы хотите поддерживать, вы должны рассмотреть ваше приложение. Если вы храните вводимые пользователем данные, может быть трудно предвидеть все локали, в которых ваше программное обеспечение в конечном итоге будет использоваться. Чтобы поддержать их всех, лучше всего было бы поддерживать UCS (Unicode) с самого начала. Тем не менее, есть цена для этого; для многих западноевропейских символов теперь требуется два байта памяти на символ вместо одного.

Выбор правильного сопоставления может повысить производительность, если ваша база данных использует сопоставление для создания индекса, а затем использует этот индекс для предоставления отсортированных результатов. Однако, поскольку правила сортировки часто зависят от локали, этот индекс будет бесполезен, если вам нужно отсортировать результаты в соответствии с правилами другой локали.

Я предлагаю использовать utf8mb4_unicode_ci, который основан на стандарте Unicode для сортировки и сравнения, который сортирует точно в очень широком диапазоне языков.

Другие вопросы по тегам