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

标签 php mysql md5

我有一个 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/

相关文章:

php - TYPO3 TCA 在后端保存对象后执行 Hook

php - Zend框架/表格: custom elements not shown on error

MySQL - 在提高查询性能方面需要帮助

php - 如何从 MySQL 表中的纬度/经度获取最近的地点?

language-agnostic - md5 哈希的前 32 位是否与任何其他子字符串一样为 "random"?

python - 获取文件的 md5 而不将其保存在光盘上

php - 如何在 Wordpress 中启用 Animate.css

php - 如何在一个 SQL 语句中从当前行的前一行获取 "use"mysql 单元格,并显示包括第一行在内的所有行?

mysql - 如何获取第一个字母与三个字母之一匹配的记录

php - 使用 md5() 对密码进行散列并将其存储到数据库后,无法再次登录