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

316

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

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

Сандер Верслуйс
источник

Ответы:

512

Из документов 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 'в одном из двух немецких сопоставлений).

Дэн Эспарза
источник
206

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

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

мат
источник
5
Важно отметить, что для одной кодировки может быть много разных сопоставлений. Тот, который является «правильным», зависит от семантики текста, которая обычно определяется языком, на котором он написан.
Фил
20

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

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

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

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

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

Эриксон
источник
извини, чувак, я только начинающий, и мне просто нужны твои разъяснения. Итак, могу ли я понять сопоставление, как это, это то, что гарантирует, что каждый символ (будь то латинский или китайский) правильно распознан и имеет соответствующие кодировки. Это правильно? Надеюсь на ваш ответ
Мирич
1
@Mirich Нет, сортировка - это информация о том, как сортировать символы. Разные регионы мира предпочитают сортировать персонажей по-разному.
Эриксон
3

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

simhumileco
источник
3
из ОП: «Я прошу объяснения двух и как их выбрать»
Дэн Эспарза
1
@ simhumileco, извини, чувак. Я только начинающий, и мне просто нужны твои разъяснения. Итак, могу ли я понять сопоставление, как это, это то, что гарантирует, что каждый символ (будь то латинский или китайский) правильно распознан и имеет соответствующие кодировки. Это правильно? Надеюсь на ваш ответ
Мирич
1
@Mirich Все зависит от того, какую кодировку вы используете в других местах; если вы используете UTF-8кодировку в системе вне базы данных, то все в базе данных также должно быть правильно написано, если вы используете utf8mb4в MySQL . Когда дело доходит до правильной операции сортировки, сравнения и преобразования текста для определенных символов в MySQL , трудно найти идеальное решение, но *_unicode_ciоно, безусловно, лучше *_general, но оно также имеет свои недостатки. Пожалуйста, прочитайте: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco