以下是本人使用中遇到的一些坑,会陆陆续续收集更新,主要目的是希望能帮助到有缘人了,文笔不高,大白话介绍手把手解决问题。如有问题或想法请指出,不胜感激!!!
1.在创建字段的时候避免使用mysql中一些关键字比如primary字段来创建主键
先看下我的mysql版本
版本5.6.22
随便找了一个表测试
嗯?怎么会有问题呢,它提示‘primary = 1’这附近有问题。 这修改语句有什么问题?类型不匹配?也不对啊primary是int类型的而我传的值也正是int类型了!嗯?开始怀疑人生,有点摸不着头脑……
之后我又随便测试了一下结果如下
此时我不使用primary来作为修改条件,竟然能修改成功什么情况?最后借助了百度
在查到了一个帖子后我清楚了是关键字的缘故。
此时再次尝试更新如下
结论:避免使用系统相关的关键字,以免造成不必要的影响,如本例的更新失败。另外5.7 8.0等版本暂时未测试,有机会补充上
2.推荐不要使用enum枚举数值类型,推荐使用tinyint类型来代替,如果非要使用enum最好不要使用数值
场景
就是做一个简单的修改操作,其中修改的字段值中包含枚举值,但是修改的结果不报错,Row matched:1 Changed:0 Warinigs:0这种情况前提条件我使用的MYSQL版本是5.6.22版本!!!
表的结构
表的结构
创建表的sql语句
sql语句
添加一条测试数据
测试数据
好的目前表的结构很简单现在我来执行修改操作
命令行修改
很简单一个修改语句 匹配到了也修改成功了
修成功后的值
接下来下面落实到程序了.以下是golang的代码片段
流程就是把刚才上一步修改的数据状态2修改成状态3,可以看到,程序并没有报错,执行了通过了但是RowsAffected结果看到,影响了0条,说明数据没有修改成功,查看库中的记录的确也没有修改成功。
那么问题来了底是哪里错了呢?
把程序中的sql语句也拷贝了出来在命令行执行是成功的,但是在代码中执行却是错的,非常的诡异。起初我怀疑过数据库编码问题,也怀疑过驱动问题,做了各种各样的怀疑和排除,唯独没有考录到程序中处理sql语句替换值的问题。
兜兜转转,最后我浪费了大半天的时间终于发现了问题,原因是我使用的state变量是int类型,我这里应该是使用字符串类型,如下:
RowsAffected为1了,再查看数据库数据也成功修改了。至于失败的原因就是数据类型不匹配,另外mysql5.8 8.0版本不知道会不会有显示提示错误信息,以后有机会测一下,挖个坑。
总结:当sql语句执行的时候,发现执行结果中match到了结果>=1,但是Changed=0,就说明以下两点情况:
1.想要修改的值和修改的值一致时。
2.修改的值和数据库设定的值不匹配也会出现此状态(本例子就是此状态)
另外,最重要的多练多看了,细心很重要了,这种低级错误往往是最致命的,程序出现这种隐式错误而且不好排查,更重要的是浪费时间啊!!!
相关文章
未完待续。。。