tiDB小结
tiDB 小结
字段无法更新问题
tidb 存在精度只能升不能下降的问题。并且对于decimal 等类型精度甚至不允许修改。为了打破这个限制可以采取曲线救国的方式实现。
分为三部曲:
- 创建一个目标类型字段_new, 的形式。
- 把数据从原有字段更新过来。
- 删除原有字段。
- 重命名new为原有字段名称。
alter table `xx_tab` add column total_price_new DECIMAL(22,3) DEFAULT '0.000';
update xx_tab set total_price_new = total_price;
alter table xx_tab drop total_price;
alter table xx_tab change column total_price_new total_price DECIMAL(22,3) DEFAULT '0.000' after cod_amount;
mysql float double decimal
float, double 都是要精度损失的。
举个例子
假如我们有一张表,用来存储用户的积分,表定义如下:
CREATE TABLE f
(f1
float(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf-8
然后向这个表里插入131072.32的积分值,如下所示
mysql> insert into f value (131072.32);
Query OK, 1 row affected (0.00 sec)
mysql> select * from f;
+-----------+
| f1 |
+-----------+
| 131072.31 |
+-----------+
1 row in set (0.00 sec)
然后会惊奇的发现,这个用户的积分少了0.01,虽然这0.01的积分并不足于引起我们的注意,但是问题还是来了
丢失数据是否是正常现象?
为什么会少0.01,有没有可能少0.02,或者少1,少10甚至少100?
怎么样才能让我们的数据准确?
其中float分配了4字节,而double分配了8字节;并且数据的这种不准确是正常现象。采用float和double本来就是不准的!!
通过前面的分析,了解了float和double类型的区别和误差来源。但是decimal类型是MySQL官方唯一指定能精确存储的类型,也是DBA强烈推荐和金钱相关的类型都要存储为decimal类型,如果猜想decimal类型的存储格式的话,那么一下两种可以保持数据的准确性
继续扩大存储空间,比double更大一个级别,比如128位甚至更多
通过字符串化或者其他的方式特殊存储起来
更新数据大小限制
tiDB 使用update 命令更新数据时,有30w 条的限制。如果数据量超过30w条就会报错。
可以使用update limit 的形式对全表进行多次的修改。
参考:
mysql 浮点精度
上一篇: 从头学pytorch(七):dropout防止过拟合
下一篇: TiDB介绍