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

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值