存储MD5哈希或NULL的最佳MySQL数据类型

时间:2013-09-27 17:41:44

标签: php mysql md5

我有一个PHP应用程序,它存储所有帐户,无论它们是否在一个表中是否处于活动状态。该表有一个名为“active”的列,该列为NULL,表示该帐户处于活动状态,或者包含MD5哈希值,表示该帐户处于非活动状态。

根据Best practices for efficiently storing md5 hashes in mysql,如果列始终包含MD5哈希并且永远不为NULL,则首选BINARY(16),并且CHAR(32)是下一个最佳选择。由于我的大多数帐户都是活动的,因此大多数列值都是NULL,我最好使用不同的数据类型,例如VARCHAR(32)?

3 个答案:

答案 0 :(得分:19)

使用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的有用说明:

         

    对于第三行,我在FIELD2和FIELD3中插入了NULL。因此,在字段起始偏移中,这些字段的顶部位是打开的(值为94十六进制,94十六进制,而不是14十六进制,14十六进制)。 行更短,因为NULL不占用空间。

  •   

(强调我的)

答案 1 :(得分:2)

在文件strings / ctype-bin.c中的MySQL源代码中定义了BINARY类型。

这看起来像默认的基于C ascii的charset转换为二进制。这应该比使用ascii_bin字符集的CHAR(32)更快。

因为写入/读取二进制文件所需的时间更少,并且索引和内存中的磁盘空间更少,并且因为CHAR(32)数据类型的字节数大16个字节

如果你想使用它,你应该使用这个PHP代码

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

答案 2 :(得分:-7)

你可以使用php函数md5(); 更高效,如果有人能够在您发送到数据库时捕获数据,那么这些数据已经被加密了。