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

tiDB小结

程序员文章站 2022-07-13 10:02:21
...

tiDB 小结

字段无法更新问题

tidb 存在精度只能升不能下降的问题。并且对于decimal 等类型精度甚至不允许修改。为了打破这个限制可以采取曲线救国的方式实现。

分为三部曲:

  1. 创建一个目标类型字段_new, 的形式。
  2. 把数据从原有字段更新过来。
  3. 删除原有字段。
  4. 重命名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 浮点精度

相关标签: mysql tiDB