我有一个PHP应用程序,它存储所有帐户,无论它们是否在一个表中是否处于活动状态。该表有一个名为“active”的列,该列为NULL,表示该帐户处于活动状态,或者包含MD5哈希值,表示该帐户处于非活动状态。
根据Best practices for efficiently storing md5 hashes in mysql,如果列始终包含MD5哈希并且永远不为NULL,则首选BINARY(16),并且CHAR(32)是下一个最佳选择。由于我的大多数帐户都是活动的,因此大多数列值都是NULL,我最好使用不同的数据类型,例如VARCHAR(32)?
答案 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(); 更高效,如果有人能够在您发送到数据库时捕获数据,那么这些数据已经被加密了。