记一个SQL字段定义bug

在今天假期线上反馈一个用户点击app时候出现了bug报错,但这个操作在测试环境已经测试了多遍,代码也是在线上跑了一些日子了,无端端报错也是十分奇怪。查看线上日志发现

1
com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column 'mobile_belong_city'

手机号码归属地过长无法写入。
再查看数据库定义,该字段长度是varchar(10)的。感觉上没啥问题,一个城市名,10个字符应该能写进去,猜想是数据有问题了。然后查看用户的数据,发现这个用户的归属地是

1
黔西南布依族苗族自治州

共11个字。最后临时先把数据库字段类型改成varchar(20)解决问题。
P.S. Mysql在5.0.3后,varchar(10)中的10开始代表字符长度,而不是字节。

总结

在定义城市等其他常见字段时候,不要太狭义只定义包含常见的内容。定义范围稍微比常见大一些,或者认真了解下字段包含的内容。
例如曼谷的全称长41个字,

1
天使之城,宏伟之城,永恒的宝石之城,永不可摧的因陀罗之城,世界上赋予九个宝石的宏伟首都,快乐之城,充满著像似统治转世神之天上住所的巍峨皇宫,一座由因陀罗给予、毗湿奴建造的城市

的确很坑爹,但是这个字段的定义不认真对待,最后坑的只有自己。

听说你想请我喝下午茶?~