You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:54:22