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

發佈了96 篇原創文章 · 獲贊 26 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章