Задавайте вопросы, мы ответим
Вы не зашли.
Ребят, наткнулся на очень интересны вопрос - http://sqlinfo.ru/forum/viewtopic.php?id=773 - но так и не понял вывод.
Так, все же, в каком формате лучше (экономнее, логичнее, нагляднее, быстрее для индексации) хранить md5-хеш?
Благодарю.
Отредактированно JohnSmith (03.01.2014 00:59:10)
Неактивен
Чаще всего хранят в char(32) charset latin1. К этому решению поддалкивает то, что функции MD5() и более предпочительная SHA1() возвращают именно hex-строку. Если требуется оптимизация - то есть доказано, что нужно экономить память на данных и индексе, то используйте UNHEX(SHA1()) - это будет binary(16). Работать binary(16) будет быстрее и индекс будет занимать меньше памяти.
Про UNHEX, см:
http://dev.mysql.com/doc/refman/5.5/en/ … tion_unhex
Неактивен
Спасибо за ответ.
Поясните еще такой момент: мы же не сужаем кол-во вариантов данного поля, переводя его в binary(16) (а не char(32))? Это просто иной вариант (тип) хранения значения хеша?
Неактивен
Это другой вариант хранения того же самого. Когда храните в hex - используете только 16 знаков из 256 возможных.
Неактивен
Очень вас благодарю за пояснения
Неактивен
rgbeast написал:
Это другой вариант хранения того же самого. Когда храните в hex - используете только 16 знаков из 256 возможных.
select md5('A');
7fc56270e7a70fa81a5935b72eacbe29
select unhex(md5('A'));
еbpГ╖╗Y5╥.╛╬)
Видно, что во втором случае используется вся таблица ASCII, но текст нечеловекочитаемый. Мы не умеем читать все 256 символов, а машина умеет, поэтому эффективнее хранить в байте именно байт, а не только 16 символов. Всегда можно вернуть читаемое значение назад:
select hex(unhex(md5('A')));
7FC56270E7A70FA81A5935B72EACBE29
rgbeast, здравствуйте!
Скажите, а при создании поля типа char можно выбрать "Сравнение" в utf8_bin - а что это такое и в чем отличие от, к примеру, utf8_general_ci? Спасибо
Неактивен
http://sqlinfo.ru/articles/info/2.html написал:
Отдельно стоит отметить бинарные сопоставления (binary). Если строки сопоставляются бинарным образом, то между ними не делается никаких сопоставлений и преобразований. Такие строки не будут преобразованы командой SET NAMES (см. далее). Бинарные сопоставления особенно удобно использовать при переходе с MySQL 3.23, который не поддерживал кодировки и который указывает, что все таблицы находятся в кодировке latin1 (не смотря на то, что таблицы могут содержать данные, скажем, в KOI8-R).
Неактивен
бинарное сопоставление utf8_bin - сравнение буде производится, как если бы данные были числами (то есть без оглядки на текстовую природу данных). В данном случае это незачем, так как utf8 будет занимать по 3 байта на символ, а вам нужен 1 байт на символ. Для действительно бинарных данных, которые не являются текстом нужно использовать тип binary.
Неактивен
спасибо, ребят!
Неактивен