tiDB小结

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 浮点精度

你可能感兴趣的:(tiDB,mysql)