关于mysql5.6 decimal 类型的几个小bug
2017-05-05 13:05
726 查看
bug 详情见官介绍:
http://bugs. href="http://lib.csdn.net/base/mysql" target=_blank>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);
查看执行计划
![](https://img-blog.csdn.net/20140504154125578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlkYW4zOTU5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
可以看到执行范围查询的时候没有正确过滤分区,该bug也尚未修复。
在生成环境有用到5.6的并且使用decimal类型场景和上述两种相同的希望大家注意一下。
参考:
http://bugs.mysql.com/bug.php?id=72056
http://bugs.mysql.com/bug.php?id=72274
http://bugs. href="http://lib.csdn.net/base/mysql" target=_blank>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
相关文章推荐
- 关于mysql5.6 decimal 类型的几个小bug
- 关于MySQL数据类型定义的几个细节-INT(N)/VARCHAR(N)/DECIMAL(M,N)
- mysql 5.5和5.6版本关于timestamp not null类型字段关于null的处理
- Mysql中NUMERIC和DECIMAL类型区别比较(已测5.6)
- 关于Mac系统中SequelPro工具对于Mysql数值类型nt(M)存值的bug
- MYSQL5.6 limit order by 的bug
- 【mysql5.6】数据类型
- 关于使用unigui、webxone、mysql的几个问题
- 几个关于数据类型的细节
- MySQL学习笔记(六):关于数据库中的datetime类型
- 关于单元格编辑模式的几个小BUG
- 1292 - Incorrect datetime value: '' for column Mysql5.6 中datetime 类型字段的插入问题
- 关于mysql 自动更新时间的 类型说明
- mysql中关于日期类型和时间类型
- MySQL 5.6 ICP bug一则
- MySQL中decimal类型的简单介绍
- Mysql中NUMERIC和DECIMAL类型区别比较
- 关于C中的Int类型到底是几个字节。
- 关于mysql innodb log file的1个bug
- mysql 关于 timestamp类型 版本问题