Django切换PostgreSQL后phonenumber_field报字符长度超限错误
问题解决方法
根本原因
- SQLite不强制校验varchar字段长度,你定义的
max_length=12在SQLite上不会生效,而PostgreSQL严格执行长度限制,所以才会在切换库后触发报错 - 你手动为
PhoneNumberField指定了max_length=12,覆盖了库的默认适配逻辑:phonenumber_field会根据你配置的PHONENUMBER_DB_FORMAT自动设置合理的max_length,NATIONAL格式默认预留20位长度,你强制设置为12导致存储时长度不足 - 你配置的
PHONENUMBER_DB_FORMAT = "NATIONAL",美国号码存储的是类似(123) 456-7890的格式,长度为14位,已经超过了你设置的12位上限,自然会触发报错。你代码注释中提到的自动拼接+1是E164格式的行为,和当前配置的NATIONAL格式不符,也侧面说明你对存储格式的判断有误。
排查步骤
连接到PostgreSQL数据库,执行以下SQL确认字段当前长度:
SELECT character_maximum_length FROM information_schema.columns WHERE table_name = '你的用户表实际名称' AND column_name = 'phone_number';
返回值就是报错信息中的x,大概率为12,符合你的字段定义。
解决方案
- 第一步:删除字段定义中的
max_length=12参数,修改为:
phone_number = PhoneNumberField(blank=False)
- 第二步:重新生成迁移文件
python manage.py makemigrations
- 第三步:执行迁移更新PostgreSQL字段长度
python manage.py migrate
如果确实需要手动指定max_length,根据你使用的存储格式设置足够的长度即可:
- E164格式:最大长度15位,建议设置
max_length=15 - NATIONAL格式:最大长度20位,建议设置
max_length=20 - INTERNATIONAL格式:最大长度16位,建议设置
max_length=16
如果你的业务需要存储带国家码的号码,建议将PHONENUMBER_DB_FORMAT修改为"E164",格式更统一,也避免不同区域号码长度判断错误的问题。
内容的提问来源于stack exchange,提问作者random person
相关产品推荐
相关产品推荐

