欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql数据库下的一些Bug记录

程序员文章站 2022-06-24 21:06:37
在项目开发的过程中,包括测试人员提出的一些bug,慢慢总结出一些mysql的使用经验。 1. decimal类型的字段总长度包括了精度长度。 比如decimal(10, 2),则表示小数点左边为8位...

在项目开发的过程中,包括测试人员提出的一些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类型字段。