mysql中md5()和sha2()是原生单向哈希函数,md5返回32位小写十六进制字符串,sha2(str, len)必须显式指定整数长度(224/256/384/512),且仅mysql 5.6+支持。

MySQL里直接用MD5()和SHA2()函数就行
MySQL原生支持哈希计算,不需要额外扩展或存储过程。但要注意:MD5()返回32位十六进制字符串,SHA2()必须显式指定长度(如256),不能只写SHA256()——那会报错FUNCTION SHA256 does not exist。
-
MD5('hello')→'5d41402abc4b2a76b9719d911017c592' -
SHA2('hello', 256)→'2cf24dba89f8b476fbb1e917762217291b5e08575e7647898e413b9e45481213' - 输入为
NULL时,两个函数都返回NULL,不是空字符串
SHA2()的第二个参数只能是224/256/384/512,别写错
MySQL的SHA2()不接受字符串标识符(比如'sha256'),只认整数。写成SHA2('x', '256')(字符串)或SHA2('x', 257)都会触发错误Invalid argument for function SHA2。
- 正确写法只有:
SHA2(str, 256)、SHA2(str, 512) - 如果业务需要兼容不同长度,建议在应用层做校验,而不是靠SQL动态传参
- 注意:MySQL 5.6+才支持
SHA2(),5.5及更早版本没有该函数
哈希结果默认是小写十六进制,没法直接转大写
MySQL没提供内置的哈希结果大小写转换函数。UPPER(MD5('a'))可行,但对SHA2()这种长字符串,性能开销略高(尤其在WHERE或ORDER BY中使用)。实际中更推荐在应用层统一处理格式。
- 如果必须SQL内转大写:
UPPER(SHA2('a', 256))合法但不推荐用于索引字段 -
LOWER()对哈希值无意义——它本来就是小写的 - 别试图用
CONV()或HEX()二次编码,那会破坏哈希值语义
在WHERE条件里用哈希函数可能让索引失效
如果你在查询中写WHERE MD5(email) = 'xxx',即使email字段有索引,这个条件也无法走索引——因为函数作用于列,优化器无法下推。
- 正确做法:把哈希值存在单独列里(如
email_md5 CHAR(32)),并为其建索引 - 插入/更新时用触发器或应用层同步计算,避免运行时重复计算
- SHA2值太长(64字符),不适合作为普通索引键,可考虑前缀索引或用
BINARY(32)存二进制形式(需配合UNHEX())











