SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.01.2014 00:45:16

JohnSmith
Участник
Зарегистрирован: 28.11.2013
Сообщений: 12

Вывод про md5 в одном из топиков

Ребят, наткнулся на очень интересны вопрос - http://sqlinfo.ru/forum/viewtopic.php?id=773 - но так и не понял вывод. wink
Так, все же, в каком формате лучше (экономнее, логичнее, нагляднее, быстрее для индексации) хранить md5-хеш?

Благодарю.

Отредактированно JohnSmith (03.01.2014 00:59:10)

Неактивен

 

#2 03.01.2014 02:40:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Вывод про md5 в одном из топиков

Чаще всего хранят в 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

Неактивен

 

#3 03.01.2014 18:40:52

JohnSmith
Участник
Зарегистрирован: 28.11.2013
Сообщений: 12

Re: Вывод про md5 в одном из топиков

Спасибо за ответ.
Поясните еще такой момент: мы же не сужаем кол-во вариантов данного поля, переводя его в binary(16) (а не char(32))? Это просто иной вариант (тип) хранения значения хеша?

Неактивен

 

#4 03.01.2014 19:51:08

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Вывод про md5 в одном из топиков

Это другой вариант хранения того же самого. Когда храните в hex - используете только 16 знаков из 256 возможных.

select md5('A');
7fc56270e7a70fa81a5935b72eacbe29
select unhex(md5('A'));
еbpГ╖╗Y5╥.╛╬)


Видно, что во втором случае используется вся таблица ASCII, но текст нечеловекочитаемый. Мы не умеем читать все 256 символов, а машина умеет, поэтому эффективнее хранить в байте именно байт, а не только 16 символов. Всегда можно вернуть читаемое значение назад:

select hex(unhex(md5('A')));
7FC56270E7A70FA81A5935B72EACBE29

Неактивен

 

#5 03.01.2014 20:01:17

JohnSmith
Участник
Зарегистрирован: 28.11.2013
Сообщений: 12

Re: Вывод про md5 в одном из топиков

Очень вас благодарю за пояснения

Неактивен

 

#6 05.01.2014 20:01:22

JohnSmith
Участник
Зарегистрирован: 28.11.2013
Сообщений: 12

Re: Вывод про md5 в одном из топиков

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? Спасибо

Неактивен

 

#7 05.01.2014 20:13:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5829

Re: Вывод про md5 в одном из топиков

http://sqlinfo.ru/articles/info/2.html написал:

Отдельно стоит отметить бинарные сопоставления (binary). Если строки сопоставляются бинарным образом, то между ними не делается никаких сопоставлений и преобразований. Такие строки не будут преобразованы командой SET NAMES (см. далее). Бинарные сопоставления особенно удобно использовать при переходе с MySQL 3.23, который не поддерживал кодировки и который указывает, что все таблицы находятся в кодировке latin1 (не смотря на то, что таблицы могут содержать данные, скажем, в KOI8-R).

Неактивен

 

#8 05.01.2014 21:22:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Вывод про md5 в одном из топиков

бинарное сопоставление utf8_bin - сравнение буде производится, как если бы данные были числами (то есть без оглядки на текстовую природу данных). В данном случае это незачем, так как utf8 будет занимать по 3 байта на символ, а вам нужен 1 байт на символ. Для действительно бинарных данных, которые не являются текстом нужно использовать тип binary.

Неактивен

 

#9 05.01.2014 22:19:25

JohnSmith
Участник
Зарегистрирован: 28.11.2013
Сообщений: 12

Re: Вывод про md5 в одном из топиков

спасибо, ребят!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson