#mysql #database #encoding #character-encoding #collation
#mysql #База данных #кодирование #кодировка символов #сортировка
Вопрос:
Я сохраняю MD5 hashes
как индексы некоторых записей, я понимаю, что для этого подходит хороший тип данных CHAR(32)
, но для чего я должен выбрать collation
?
Я предполагаю, что важно MD5
поддерживать только эти символы: abcdef0123456789
итак, мне нужна сортировка, которая поддерживает очень мало символов и не содержит специальных?
В любом случае, какая из них является лучшей сортировкой? utf8_general_ci
В моей БД используется много других строк данных.
Ответ №1:
Вам нужно будет иметь «A» == «a»? Если это так, вам нужно свернуть регистр COLLATION
.
Но, во-первых, я подозреваю, что ваш вопрос действительно касается CHARACTER SET
. Это кодировка символов. Почти любой набор символов может обрабатывать шестнадцатеричные символы. ascii
нормально; latin1
нормально. Я бы не стал использовать какие-либо наборы символов, отличные от тех, которые используются для MD5, UUID, country_code, postal_code и т. Д. И, поскольку каждый из них имеет постоянную длину, CHAR(..)
это полезно. Практически везде VARCHAR(..)
«лучше».
«Сортировка» связана с сортировкой и сравнением. После того, как вы определились с CHARACTER SET ascii
(или latin1), вам нужно решить, нужно ли вам когда-либо сравнивать a1b2
= A1B2
. Если да, используйте ascii_general_ci
(или latin1_general_ci
) . «Ci» означает «без учета регистра».
Если вы никогда не будете смешивать капитализацию, () подойдет и будет на порядок быстрее. ascii_bin
latin1_bin
«bin» означает «просто сравните биты»; то есть без сгибания регистра, удаления акцента и т. Д.
Еще лучше было бы преобразовать из CHAR(32)
в BINARY(16)
via UNHEX()
и пойти другим путем via HEX()
. Это не имеет сортировки и сокращает используемое пространство вдвое. (Но это делает строку непечатаемой.)
Для других столбцов, … Набор символов utf8mb4, а не utf8, необходим для китайского языка и смайликов (например, на вашей картинке). Я не могу судить, подходит ли сопоставление _general_ci, не понимая больше о вашем приложении.
Комментарии:
1. Хорошо, похоже, мне нужно больше исследовать
CHARACTER SET
, так как сейчас я немного потерян. Вы пропустили здесь глагол?I would not any
2. Итак, я понимаю, что для хранения значений MD5
latin
подойдет набор символов, но если у меня есть таблица, в которой мне нужно сохранить заголовки URL с китайскими символами, правильно ли использовать наборutf8
символов, нет?3. @adrianTNT — MD5, UUID, country_code, postal_code и т. Д.:
CHAR(...) CHARACTER SET latin1
; выберите сопоставление, основанное на необходимости сгибания регистра. Китайский: лучше использоватьutf8mb4
, некоторым китайским символам требуется 4 байта. (И я исправил опечатку.)4. 2 года спустя я искал это в Google, некоторое время читал страницу, а затем «вау! это я, я задал этот вопрос» :)))
5. @adrianTNT — Спустя 2 года у вас возник более сложный вопрос?