我有一个 PHP 应用程序,它将所有帐户存储在一个表中,无论它们是否处于事件状态。该表有一个名为“事件”的列,该列要么为 NULL,表示该帐户处于事件状态,要么包含一个 MD5 哈希值,表示该帐户不活动。
根据 Best practices for efficiently storing md5 hashes in mysql ,如果该列始终包含 MD5 散列且从不为 NULL,则 BINARY(16) 是首选,CHAR(32) 是下一个最佳选择。由于我的大部分帐户都处于事件状态,因此大多数列值将为 NULL,我是否最好使用不同的数据类型,例如 VARCHAR(32)?
最佳答案
使用 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
Helpful Notes About NULLs:
For the third row, I inserted NULLs in FIELD2 and FIELD3. Therefore in the Field Start Offsets the top bit is on for these fields (the values are 94 hexadecimal, 94 hexadecimal, instead of 14 hexadecimal, 14 hexadecimal). And the row is shorter because the NULLs take no space.
(强调我的)
关于php - 存储 MD5 哈希或 NULL 的最佳 MySQL 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19056925/