MD5函数返回32位小写十六进制字符串非二进制值不适用于密钥派生或密码存储仅适合数据完整性校验等有限场景且需注意索引失效、字符集影响及空字符串与NULL的区别。MD5函数返回的是16进制字符串不是二进制哈希值MySQL 的 MD5() 函数输出是 32 位小写十六进制字符串如 5d41402abc4b2a76b9719d911017c592不是原始字节。这意味着它不能直接用于需要二进制摘要的场景比如和 OpenSSL 的 md5 -binary 结果比对也不适合做密钥派生。常见错误现象SELECT MD5(hello) UNHEX(5d41402abc4b2a76b9719d911017c592) 返回 0 —— 因为左边是字符串右边是二进制类型不匹配导致隐式转换失败。如果真要存二进制形式用 UNHEX(MD5(hello))但字段类型得是 BINARY(16) 或 VARBINARY(16)MD5() 是确定性函数相同输入永远得相同输出毫无盐值salt可言完全不防彩虹表MySQL 8.0 已明确标记 MD5() 为“不安全哈希”审计或合规场景下会被拦截别用MD5做密码存储连SHA2都比它强一点用 MD5() 存用户密码等于把钥匙挂在门把手上。它计算太快、无盐、已被大规模破解。哪怕加个固定字符串拼接MD5(CONCAT(salt, password))也只是拖延时间不解决根本问题。使用场景限制很窄仅限校验数据完整性比如确认配置文本没被篡改、临时 token 签名非敏感、或兼容旧系统迁移过渡。生产环境密码必须用 SHA2(password, 256) 或更优方案如应用层用 bcrypt / Argon2SHA2() 返回的是 64 位十六进制字符串SHA-256同样需注意是否要转 UNHEX()MySQL 5.7 支持 VALIDATE_PASSWORD 插件启用后 MD5() 可能被禁止用于 CREATE USER ... IDENTIFIED WITH mysql_native_passwordMD5在WHERE条件里用会拖慢查询尤其没索引时对字段用 MD5(col) 做 WHERE 条件比如 WHERE MD5(email) xxxMySQL 无法走索引只能全表扫描——因为函数改变了原始值索引失效。 Trenz AI驱动的社交电商营销平台专为TikTok Shop设计