本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文所用例子非真实项目,仅为了复现原错误,并逐步分析并解决这个问题的一个过程!
写了一个类似于沸点的小demo(取名:速记),用于随时记录日常(也可以说是一个私人的小记事本吧),前端采用uniapp的H5页面,后端为net webapi(orm采用的是SqlSugar),数据库用的是mysql,其他的就不细说了
由于H5页面会涉及到跨域问题,所以在部署时,已经用nginx配置好了相关跨域问题,且项目已经线上运行了一段时间
突然的一个下午,准备发一条速记,发现 ‘发布’ 按钮 失效了!
PC端尝试,打开F12,发现控制台里报错了
好端端的项目,为何突然报跨域问题?
第一反应,难道是我刚买的域名未备案,给我关停了
肯定不是,未备案也不是这个报错啊。\
排查错误
从ORM相关代码开始排查
半天未发现什么问题,于是再次去测试发布一条测试速记
这时居然能发布成功.....
再次编辑那一长串文字发布时,又无法发布
分析:只能发布短的内容?内容字段长度被限制了
再次查看项目代码
Model上并未写相关限制特性注解,ORM的配置代码中,初始化数据表,给了一个默认字符串长度....
db.CodeFirst.SetStringDefaultLength(200).InitTables(types);
//这个设置默认长度的优先级低于Model上的特性注解
//也可以说只对无长度设置的string类型的字段有效
为了印证,这个设置确实生效了,到数据库中查询一下表结构
show create table ShortHand;
还真的是200!问题找到了,下一步开始解决问题了\
汉字 -- 字节
为了考虑字段设置多长,特意回顾了下字节相关知识点
一个汉字占3个字节,200字节...那就最多不能超过66个汉字(理论值)
那这个确实短了,改成1500字节,这样限制文字500,够用了
修改表结构
我的方法简单直接
直接在Model上加一个特性注解
[SugarColumn(Length = 1500)]
public string content { get; set; }
//注:
//最大值写法 Length=int.MaxValue
//也可以写成 Length = -1 也表示最大值
另外:如果Length设置大于4000,默认就是最大值了
经测试,项目跑起来没问题,字段长度在数据库表结构中也同步了修改
测试发布长文也没有问题
问题基本得到了解决....
不过文章写到这里,还没完
请继续看下去
反向修改表结构异常
为什么要反向修改呢,为了是让本文开头所说的报错重现(从1500改回到200...)
直接修改代码中Model的特性注解
然后运行项目...出现了新的错误
这简直是屋漏偏逢连夜雨的节奏....
至此我还是觉得是ORM出了问题(这也是文章开头我特意提了ORM用的是哪个的原因)
到SqlSugar官网论坛上搜了一把
找了一个最相似的,说修改表名,迁移数据,可重新设计表结构....费那事?\
这条路走不通,换一个方式试试,SQL!
尝试使用SQL修改表结构
用SQL直接在Navicat中来修改\
ALTER TABLE ShortHand MODIFY COLUMN content VARCHAR(200);
依然报错
既然这个错误那么诡异,修改ORM相关代码改不了,用SQL也改不了,莫非MySQL有问题(不可能....),我的数据有问题?
经过分析,我发现了错误原因
就是数据库表已存在的数据导致了我的字段长度修改不了的原因!
简单的说就是:我表中已经有长度超过200的数据了,现在把字段长度修改成200,那之前存在的数据就溢出了!这种情况数据库肯定阻拦\
为了验证我上面说的,我新建了一个空的数据库
这时无论是修改Model还是通过sql修改字段长度,都没有出现上面问题,都可以成功修改!
印证了我的分析结果。
好了,这个反向修改表结构又学到了一点新东西
文末总结
道路是曲折的,成长是自己的。荆棘中摸索前进,总比平坦大道上跑摔跟头要好。
问题发生,还是不能瞎猜,不能乱了阵脚,必须静下心来,分析、猜想,然后尝试,方能找到元凶。