深入分析MySQL數(shù)據(jù)類型 DECIMAL
前言:
當(dāng)我們需要存儲(chǔ)小數(shù),并且有精度要求,比如存儲(chǔ)金額時(shí),通常會(huì)考慮使用DECIMAL字段類型,可能大部分同學(xué)只是對DECIMAL類型略有了解,其中的細(xì)節(jié)還不甚清楚,本篇文章將從零開始,為你講述DECIMAL字段類型的使用場景及方法。
1.DECIMAL類型簡介
DECIMAL從MySQL 5.1引入,列的聲明語法是DECIMAL(M,D)。NUMERIC與DECIMAL同義,如果字段類型定義為NUMERIC,則將自動(dòng)轉(zhuǎn)成DECIMAL。
對于聲明語法DECIMAL(M,D),自變量的值范圍如下:
M是最大位數(shù)(精度),范圍是1到65??刹恢付?,默認(rèn)值是10。 D是小數(shù)點(diǎn)右邊的位數(shù)(小數(shù)位)。范圍是0到30,并且不能大于M,可不指定,默認(rèn)值是0。例如字段 salary DECIMAL(5,2),能夠存儲(chǔ)具有五位數(shù)字和兩位小數(shù)的任何值,因此可以存儲(chǔ)在salary列中的值的范圍是從-999.99到999.99。
2.DECIMAL使用實(shí)戰(zhàn)
下面我們將創(chuàng)建測試表來驗(yàn)證DECIMAL字段類型的使用:
# 創(chuàng)建具有DECIMAL字段的表 驗(yàn)證decimal默認(rèn)是decimal(10,0)mysql> create table decimal_tb (col1 decimal,col2 decimal(5,2));Query OK, 0 rows affected (0.04 sec)mysql> show create table decimal_tbG*************************** 1. row *************************** Table: decimal_tbCreate Table: CREATE TABLE `decimal_tb` ( `col1` decimal(10,0) DEFAULT NULL, `col2` decimal(5,2) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)# 插入數(shù)據(jù)測試# 結(jié)論:超出存儲(chǔ)范圍會(huì)報(bào)錯(cuò),小數(shù)位不足會(huì)自動(dòng)補(bǔ)0,首位數(shù)字為0自動(dòng)忽略,小數(shù)位超出會(huì)截?cái)?并按四舍五入處理。mysql> insert into decimal_tb (col1,col2) values (100,100);Query OK, 1 row affected (0.05 sec)mysql> insert into decimal_tb (col2) values (1.23);Query OK, 1 row affected (0.01 sec)mysql> insert into decimal_tb (col2) values (10.2);Query OK, 1 row affected (0.01 sec)mysql> insert into decimal_tb (col2) values (09.9);Query OK, 1 row affected (0.01 sec)mysql> select * from decimal_tb;+------+--------+| col1 | col2 |+------+--------+| 100 | 100.00 || NULL | 1.23 || NULL | 10.20 || NULL | 9.90 |+------+--------+4 rows in set (0.00 sec)mysql> insert into decimal_tb (col2) values (9999);ERROR 1264 (22003): Out of range value for column ’col2’ at row 1mysql> insert into decimal_tb (col2) values (12.233); Query OK, 1 row affected, 1 warning (0.01 sec)mysql> show warnings;+-------+------+-------------------------------------------+| Level | Code | Message |+-------+------+-------------------------------------------+| Note | 1265 | Data truncated for column ’col2’ at row 1 |+-------+------+-------------------------------------------+1 row in set (0.00 sec)mysql> insert into decimal_tb (col2) values (12.2300);Query OK, 1 row affected (0.01 sec)# 變量范圍測試# 結(jié)論:M范圍是1到65,D范圍是0到30,且D不大于Mmysql> alter table decimal_tb add column col3 decimal(6,6);Query OK, 0 rows affected (0.12 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table decimal_tb add column col4 decimal(6,7); ERROR 1427 (42000): For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column ’col4’).mysql> alter table decimal_tb add column col4 decimal(65,2);Query OK, 0 rows affected (0.11 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table decimal_tb add column col4 decimal(66,2);ERROR 1426 (42000): Too-big precision 66 specified for ’col4’. Maximum is 65.mysql> alter table decimal_tb add column col5 decimal(60,30); Query OK, 0 rows affected (0.13 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> alter table decimal_tb add column col6 decimal(60,31);ERROR 1425 (42000): Too big scale 31 specified for column ’col6’. Maximum is 30.
3.DECIMAL使用總結(jié)
上面的內(nèi)容從實(shí)戰(zhàn)出發(fā),介紹了DECIMAL類型的使用方法及注意事項(xiàng),你可能也知道float、double這些浮點(diǎn)數(shù)類型,這兩個(gè)同樣可以存儲(chǔ)小數(shù),但這里不過多介紹,只是提醒大家float、double類型無法確保精度,很容易產(chǎn)生誤差,特別是在求和計(jì)算的時(shí)候,所有當(dāng)存儲(chǔ)小數(shù),特別是涉及金額時(shí)推薦使用DECIMAL類型。這里總結(jié)下使用DECIMAL應(yīng)該注意的事項(xiàng):
DECIMAL(M,D)中,M范圍是1到65,D范圍是0到30。 M默認(rèn)為10,D默認(rèn)為0,D不大于M。 DECIMAL(5,2)可存儲(chǔ)范圍是從-999.99到999.99,超出存儲(chǔ)范圍會(huì)報(bào)錯(cuò)。 存儲(chǔ)數(shù)值時(shí),小數(shù)位不足會(huì)自動(dòng)補(bǔ)0,首位數(shù)字為0自動(dòng)忽略。 小數(shù)位超出會(huì)截?cái)?,產(chǎn)生告警,并按四舍五入處理。 使用DECIMAL字段時(shí),建議M,D參數(shù)手動(dòng)指定,并按需分配。總結(jié):
本文比較簡單實(shí)用,通讀下來,你大概會(huì)明白DECIMAL字段的使用場景及注意事項(xiàng),其實(shí)對于常見的字段類型,我們只需要了解其使用場景及注意事項(xiàng)即可,當(dāng)我們建表時(shí),能夠快速選出合適的字段類型才是我們的目的,比如當(dāng)我們需要存儲(chǔ)小數(shù)時(shí),能夠使用DECIMAL類型并且根據(jù)業(yè)務(wù)需要選擇合適的精度,這樣我們的工作將很容易開展下去。
以上就是深入分析MySQL數(shù)據(jù)類型 DECIMAL的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)類型 DECIMAL的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. mysql-bin.000001文件的來源及處理方法2. Access數(shù)據(jù)庫安全的幾個(gè)問題3. Windwos下MySQL 64位壓縮包的安裝方法學(xué)習(xí)記錄4. 數(shù)據(jù)庫相關(guān)的幾個(gè)技能:ACCESS轉(zhuǎn)SQL6. mysql啟動(dòng)時(shí)報(bào)錯(cuò) ERROR! Manager of pid-file quit without7. mysql命令行客戶端結(jié)果分頁瀏覽8. sqlite時(shí)間戳轉(zhuǎn)時(shí)間語句(時(shí)間轉(zhuǎn)時(shí)間戳)9. 深入了解MySQL ClickHouse中的物化視圖功能10. SQLite3中的日期時(shí)間函數(shù)使用小結(jié)

網(wǎng)公網(wǎng)安備