SQLAlchemy 插入数据报错:Data too long for column ‘password_hash’
数据过长导致插入失败:尝试写入 users 表的 password_hash 列的值超过了该列允许的最大长度。
在使用 SQLAlchemy + MySQL 时,我遇到了一个常见但容易忽略的问题:插入用户密码哈希时,报错如下:
sqlalchemy.exc.DataError: (pymysql.err.DataError) (1406, “Data too long for column ‘password_hash’ at row 1”)
一、错误原因分析
从报错信息可以看出,这是 数据过长 导致的错误(MySQL 错误码 1406)。具体原因如下:
我使用了 scrypt 算法生成密码哈希。
scrypt 哈希字符串通常很长,例如:
scrypt:32768:8:1$VlHH97jhtTsuwxnr$7d4e22e6fd6bafc007dc31bbd7d735bd3d632599bdb26bee907ad8c528b8caf3a209ab6e636668195517afd89b90f4e3e70c7cdb84f21d8b0104b0693405c9c0
而数据库表 users 中 password_hash 列原本定义为 VARCHAR(255),显然无法存下如此长的字符串,因此插入失败。
二、解决方案
1. 修改数据库列长度
可以将 password_hash 列长度增大,例如 1024:
ALTER TABLE users MODIFY COLUMN password_hash VARCHAR(1024);
如果未来可能使用更长的哈希算法,建议直接使用 TEXT 类型:
ALTER TABLE users MODIFY COLUMN password_hash TEXT;
注意:在执行 ALTER TABLE 语句之前,要先选择数据库:
USE your_database_name;
2. 确保 SQLAlchemy 模型同步
如果你使用 ORM 模型,也要保证列长度一致,例如:
from sqlalchemy import Column, String, Text
# 如果使用 VARCHAR(1024)
password_hash = Column(String(1024))
# 如果使用 TEXT
password_hash = Column(Text)
3. 插入数据验证
修改完成后,再执行原来的插入操作:
new_user = User(
username=’admin’,
password_hash=hashed_password,
email=’example@qq.com’
)
session.add(new_user)
session.commit()
这时候就不会再报 Data too long 错误。
三、结语
错误本质:插入的数据长度超过数据库列定义长度。
解决思路:增加列长度或改为 TEXT,并确保 ORM 模型同步。
经验提示:现代哈希算法(如 scrypt、bcrypt、argon2)生成的哈希字符串通常超过 255 字符,建议直接使用 VARCHAR(1024) 或 TEXT 类型。
