Mysql数据库下的一些Bug记录
在项目开发的过程中,包括测试人员提出的一些bug,慢慢总结出一些mysql的使用经验。
1. decimal类型的字段总长度包括了精度长度。
比如decimal(10, 2),则表示小数点左边为8位,右边为2位。decimal类型字段常用于存储精度要求高的数字。
2. 字段默认不区分大小写。
测试跟我说,产品名判断是否重名时有bug,不能区分大小写。存在名为test的产品,再取test时竟然提示重名。
解决方法有几种:
(1)添加binary关键字
select * from table where binary name = 'test';
(2)设置字符集为utf8_bin
utf8_bin:区分大小写; utf8_general_ci:不区分大小写
3. 当有group by时,不能直接用count(*)计算行数。
比如:
select * from table where conditions group by column_1, column_2 limit pagestart, pagesize;
无法用以下sql语句来计算行数:
select count(*) from table where conditions group by column_1, column_2;
需将group by的部分放入count里,即改成:
select count(distinct column_1, column_2) from table where conditions;
4.用limit来实现分页,需要两条sql语句。
(1)用limit offset, pagesize来实现分页;
(2)同时要获取同等sql(去除分页条件)结果的总数量,来给前端进行分页计算。
这里有个优化sql的地方:limit的offset越大,效率越低
原本:
select id from table limit 100000, 10;
改进:
select id from table where id > 100000 limit 10;
5. datetime类型字段自动更新时间的问题。
项目发现一个bug,修改表中数据会记录修改时间updated_at,结果创建时间created_at也跟着更新,导致某个定时任务的逻辑判断出了问题。
当表中有datetime类型的字段a和b,其中b字段设置了on update current_timestamp。当修改了字段a时,b会自动更新为最新时间。
所以尽量把datetime类型字段的on update current_timestamp自动设置更新时间这个特性去掉,由业务层去设置时间。
6.存储json字符串可以用json类型字段。
推荐阅读
-
asp下如何在Access数据库中立即得到所插入记录的自动编号?
-
Mac环境下php操作mysql数据库的方法分享
-
MySQL在command line Client下的一些命令
-
deepin 2014系统下安装mysql数据库的方法步骤
-
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
-
Linux下远程连接MySQL数据库的方法
-
Linux下修改MySQL数据库数据文件路径的步骤
-
删除mysql数据库中的重复数据记录
-
记录Window系统下myeclipes连接linux下mysql所出现的一个bug
-
php下将图片以二进制存入mysql数据库中并显示的实现代码