MySQL使用SHA2函数报错“Truncated incorrect INTEGER value”求助
解决MySQL中SHA2()参数错误及密码哈希生成问题
错误原因
你遇到的ERROR 1292 (22007)是因为SHA2()函数的第二个参数必须是整数(可选值为224、256、384、512,对应不同长度的SHA-2哈希),但你传入了$5$de4fc1ag9ae0fa4d5b7983fa9fa61458这种字符串,MySQL尝试将其转换为整数失败,因此抛出截断错误。
解决方案
根据你是否需要保留原ENCRYPT()生成的$5$格式CRYPT哈希,分两种情况处理:
1. 仅需生成SHA-2哈希(无需CRYPT格式)
如果你的users表crypt字段只需存储纯SHA-2哈希值,修正后的SQL如下:
带随机盐的安全写法(推荐)
SET @salt = MD5(RAND()); INSERT INTO users (id, name, maildir, crypt) VALUES ('postbox@yourdomain.com', 'postbox_yourdomain_com', 'yourdomain.com/postbox/', SHA2(CONCAT('loginpwd', '@', @salt), 256) );
提示:建议在
users表中新增一个salt字段存储生成的盐值,后续验证密码时需要用相同的盐重新计算哈希进行比对。
无盐写法(安全性低,不推荐)
INSERT INTO users (id, name, maildir, crypt) VALUES ('postbox@yourdomain.com', 'postbox_yourdomain_com', 'yourdomain.com/postbox/', SHA2('loginpwd', 256) );
2. 需要生成$5$开头的CRYPT格式SHA-256哈希
原ENCRYPT()函数是调用系统crypt()接口生成标准CRYPT格式哈希($5$代表SHA-256算法),但MySQL 8.0+已移除该函数,可通过以下方式实现:
- 使用MariaDB:MariaDB仍保留
ENCRYPT()函数,可直接复用你最初的SQL(需确保数据库服务器为MariaDB)。 - 应用层生成哈希:在业务代码中用语言内置工具生成,比如Python的
crypt模块、PHP的crypt()函数,生成$5$格式的哈希后再存入数据库。示例(Python):import crypt password = 'loginpwd' salt = crypt.mksalt(crypt.METHOD_SHA256) hashed_password = crypt.crypt(password, salt) # 将hashed_password插入到users表的crypt字段 - 自定义MySQL UDF:若必须在SQL中实现,可编写用户定义函数调用系统
crypt接口,但需要服务器管理员权限,操作复杂,不推荐普通场景使用。
内容的提问来源于stack exchange,提问作者Andrés Chandía
相关产品推荐
相关产品推荐

