Какую сортировку MySQL выбрать при сохранении символа MD5 (32)?

#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 года у вас возник более сложный вопрос?