关于mysql5.6 decimal 类型的几个小bug

来源:互联网 发布:手机彩膜 知乎 编辑:程序博客网 时间:2024/05/21 14:37

bug 详情见官介绍:

http://bugs.MySQL.com/bug.PHP?id=72056  (1)当存储的decimal值超级大的时候,在没有索引的情况下,mysql会认为所有的值一样大

http://bugs.mysql.com/bug.php?id=72274  (2)当使用decimal 做分区key的时候,分区key无法正确过滤分区的问题


一,关于bug (1)

创建测试表:

 CREATE TABLE `decimalTest`(`value` DECIMAL(24,0) NOT NULL);

插入测试数据:

 INSERT INTO `decimalTest`(`value`) VALUES('100000000000000000000001'), ('100000000000000000000002'), ('100000000000000000000003');

 INSERT INTO `decimalTest`(`value`) VALUES('1234'),('5678');

执行查询:

(a),字符串数字巨大值做条件:

SELECT * FROM `decimalTest` WHERE `value` = '100000000000000000000002';

+--------------------------+
|     value                      |
+--------------------------+
| 100000000000000000000001 |
| 100000000000000000000002 |
| 100000000000000000000003 |
+--------------------------+

查询结果不对

(b),数值数字巨大值做条件:

 SELECT * FROM `decimalTest` WHERE `value` = 100000000000000000000002;
+--------------------------+
|       value                    |
+--------------------------+
| 100000000000000000000002 |
+--------------------------+

查询结果正确


==================这一部分是自己添加的,为了对比测试======================

(c)字符串数值小值做条件

select * from  `decimalTest` WHERE `value` ='1234';

+-------+
| value |
+-------+
|  1234 |
+-------+

查询结果正确

=======================================================================

(d)对字段添加索引,然后重新执行(a)查询

alter table decimalTest add index ind_decimal  (`value`);  

SELECT * FROM `decimalTest` WHERE `value` = '100000000000000000000002';
+--------------------------+
|       value                    |
+--------------------------+
| 100000000000000000000002 |
+--------------------------+

结果正确

总结:当使用超大字符串数值作为条件查询时,mysql会将他们认为一样大,这个时候需要加索引才可以避免错误,该bug在5.5、5.6都存在目前没有修复


二,关于bug (2)

正常情况下decimal是不能直接作为分区key的,不过我们可以使用函数进行转换来实现

创建测试表:

CREATE TABLE test(test DECIMAL(31,20) PRIMARY KEY)

 PARTITION BY RANGE(FLOOR(test))

(

PARTITION p0 VALUES LESS THAN(1),

PARTITION p1 VALUES LESS THAN(2)

) ;

插入测试数据:

insert into test values(0),(1);

查看执行计划


可以看到执行范围查询的时候没有正确过滤分区,该bug也尚未修复。

在生成环境有用到5.6的并且使用decimal类型场景和上述两种相同的希望大家注意一下。


参考:

http://bugs.mysql.com/bug.php?id=72056  

http://bugs.mysql.com/bug.php?id=72274 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 异地恋没话题聊怎么办 谈了半年分手了怎么办 博士6年没毕业怎么办 发现孩子早恋家长应该怎么办 异地恋想嘿嘿嘿怎么办 妈妈溜冰溜大了怎么办 皮鞋被雨水泡了怎么办 老婆提出离婚我不想离怎么办 极度缺爱的人怎么办 生二胎住院大宝怎么办 爸妈偏心我该怎么办 无创21体高风险怎么办 无创检查高风险怎么办 唐氏筛查21三体高危怎么办 唐筛年龄高风险怎么办 21三体综合症高风险怎么办 朋友深陷李强365怎么办 飞机上烟瘾犯了怎么办 怀孕一个月吸烟了怎么办 烟瘾犯了没烟怎么办 押金交了不租了怎么办 买车首付款不够怎么办 双11订金不退怎么办 在商场买到假货怎么办 网上买到假手机怎么办 网上买了假手机怎么办 网银转账被骗了怎么办 支付宝被骗了钱怎么办 被支付宝骗了钱怎么办 头发出油怎么办小妙招 照相的时候脸歪怎么办 怀孕两个月同床了怎么办 小姐被警察抓了怎么办 我的世界迷路了怎么办 砸到手指甲很痛怎么办 手被锤子砸肿了怎么办 拇指突然疼肿了怎么办 手指甲压紫了痛怎么办 砸到手指头肿了怎么办 小婴儿体重不长怎么办 2岁半宝宝不说话怎么办