2013-09-27 5 views
6

У меня есть приложение PHP, которое хранит все учетные записи независимо от того, активны они или нет в одной таблице. В таблице есть столбец с именем «active», который либо равен NULL, что означает, что учетная запись активна, либо содержит хэш MD5, что означает, что учетная запись неактивна.Лучший тип данных MySQL для хранения хэша MD5 или NULL

Согласно Best practices for efficiently storing md5 hashes in mysql, если столбец всегда содержит хеш MD5 и никогда не имеет значения NULL, тогда BINARY (16) является предпочтительным, а CHAR (32) является следующим лучшим выбором. Поскольку большинство моих учетных записей активны, и поэтому большинство значений столбца будет NULL, мне лучше использовать другой тип данных, например VARCHAR (32)?

+1

да вы можете .. 'VARCHAR (32)' предпочтительнее. –

+0

Возможный дубликат [MySQL: какой тип данных использовать для хэшированного поля пароля и какой длины?] (Http://stackoverflow.com/questions/247304/mysql-what-data-type-to-use-for-hashed- password-field-and-how-length) –

ответ

12

Нет смысла использовать VARCHAR. Хеши MD5 всегда 128-битные, поэтому CHAR (32) содержит строку шестнадцатеричных цифр, или BINARY (16) содержит строку байтов после UNHEX() шестнадцатеричных цифр.

Использование NULL не зависит от выбора типа данных. MySQL может хранить NULL вместо строки, либо CHAR, либо VARCHAR. Но на самом деле, в стандартном формате InnoDB по умолчанию MySQL не хранит NULL вообще, он ничего не хранит для столбцов, которые являются NULL.


Ссылка: http://dev.mysql.com/doc/internals/en/innodb-field-contents.html

  • Полезные заметки О значения NULL:

    В третьем ряду, я вставил NULLs в Field2 и field3. Поэтому в смещениях начала поля верхний бит включен для этих полей (значения равны 94 шестнадцатеричным, 94 шестнадцатеричным, вместо 14 шестнадцатеричных, 14 шестнадцатеричных). И строка короче, потому что NULL не занимают места.

(курсив мой)

+0

Спасибо, Билл, поэтому, основываясь на вашем ответе, я понимаю, что если я использую CHAR (32) или BINARY (16), а сохраненное значение равно NULL, то мои накладные расходы не превышают используя VARCHAR (32). Спасибо, и я надеюсь, что ты прав! – user1032531

+0

+1 Bill and @ user1032531 Билл означает, что вы должны использовать CHAR (32) или BINARY (16). и да, ваши накладные расходы будут больше, если вы используете VARCHAR, потому что MySQL нуждается в сохранении двух шорт, чтобы узнать, насколько велика ваша VARCHAR.И точный ключ поиска должен в thoery быстрее на столбцах CHAR, когда вы определяете charset ascii_bin. –

0

В исходном коде MySQL в файлах string/ctype-bin.c определен тип BINARY.

Это похоже на кодировку C ascii по умолчанию, преобразованную в двоичную. Это должно быть быстрее, чем CHAR (32) с ascii_bin charset.

Потому что меньше времени требуется для записи/чтения двоичного файла и занимает меньше дискового пространства в индексах и памяти и потому, что (32) тип данных CHAR 16 байт больше

Если вы хотите использовать это, вы должны использовать это php-код

<?php 
    md5 ("password", true); // true returns the binary what is 16 bytes long MySQl BINARY(16) 
?> 
-5

Вы можете использовать функцию PHP md5(); Более эффективен, и если кто-то может поймать данные при отправке в базу данных, это будет уже зашифровано.

+2

Как это отвечает на вопрос? – mistika

Смежные вопросы