深入分析MySQL數(shù)據(jù)類型 DECIMAL
前言:
當(dāng)我們需要存儲小數(shù),并且有精度要求,比如存儲金額時,通常會考慮使用DECIMAL字段類型,可能大部分同學(xué)只是對DECIMAL類型略有了解,其中的細節(jié)還不甚清楚,本篇文章將從零開始,為你講述DECIMAL字段類型的使用場景及方法。
1.DECIMAL類型簡介
DECIMAL從MySQL 5.1引入,列的聲明語法是DECIMAL(M,D)。NUMERIC與DECIMAL同義,如果字段類型定義為NUMERIC,則將自動轉(zhuǎn)成DECIMAL。
對于聲明語法DECIMAL(M,D),自變量的值范圍如下:
- M是最大位數(shù)(精度),范圍是1到65??刹恢付?,默認值是10。
- D是小數(shù)點右邊的位數(shù)(小數(shù)位)。范圍是0到30,并且不能大于M,可不指定,默認值是0。
例如字段 salary DECIMAL(5,2),能夠存儲具有五位數(shù)字和兩位小數(shù)的任何值,因此可以存儲在salary列中的值的范圍是從-999.99到999.99。
2.DECIMAL使用實戰(zhàn)
下面我們將創(chuàng)建測試表來驗證DECIMAL字段類型的使用:
# 創(chuàng)建具有DECIMAL字段的表 驗證decimal默認是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_tb\G *************************** 1. row *************************** Table: decimal_tb Create Table: CREATE TABLE `decimal_tb` ( `col1` decimal(10,0) DEFAULT NULL, `col2` decimal(5,2) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec) # 插入數(shù)據(jù)測試 # 結(jié)論:超出存儲范圍會報錯,小數(shù)位不足會自動補0,首位數(shù)字為0自動忽略,小數(shù)位超出會截斷 并按四舍五入處理。 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 1 mysql> 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不大于M mysql> alter table decimal_tb add column col3 decimal(6,6); Query OK, 0 rows affected (0.12 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> 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: 0 mysql> 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: 0 mysql> 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)容從實戰(zhàn)出發(fā),介紹了DECIMAL類型的使用方法及注意事項,你可能也知道float、double這些浮點數(shù)類型,這兩個同樣可以存儲小數(shù),但這里不過多介紹,只是提醒大家float、double類型無法確保精度,很容易產(chǎn)生誤差,特別是在求和計算的時候,所有當(dāng)存儲小數(shù),特別是涉及金額時推薦使用DECIMAL類型。這里總結(jié)下使用DECIMAL應(yīng)該注意的事項:
- DECIMAL(M,D)中,M范圍是1到65,D范圍是0到30。
- M默認為10,D默認為0,D不大于M。
- DECIMAL(5,2)可存儲范圍是從-999.99到999.99,超出存儲范圍會報錯。
- 存儲數(shù)值時,小數(shù)位不足會自動補0,首位數(shù)字為0自動忽略。
- 小數(shù)位超出會截斷,產(chǎn)生告警,并按四舍五入處理。
- 使用DECIMAL字段時,建議M,D參數(shù)手動指定,并按需分配。
總結(jié):
本文比較簡單實用,通讀下來,你大概會明白DECIMAL字段的使用場景及注意事項,其實對于常見的字段類型,我們只需要了解其使用場景及注意事項即可,當(dāng)我們建表時,能夠快速選出合適的字段類型才是我們的目的,比如當(dāng)我們需要存儲小數(shù)時,能夠使用DECIMAL類型并且根據(jù)業(yè)務(wù)需要選擇合適的精度,這樣我們的工作將很容易開展下去。
以上就是深入分析MySQL數(shù)據(jù)類型 DECIMAL的詳細內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)類型 DECIMAL的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
win11設(shè)置mysql開機自啟的實現(xiàn)方法
本文主要介紹了win11設(shè)置mysql開機自啟的實現(xiàn)方法,要通過命令行方式設(shè)置,具有一定的參考價值,感興趣的可以了解一下2024-03-03MySQL中用戶授權(quán)以及刪除授權(quán)的方法
這篇文章主要介紹了MySQL中用戶授權(quán)以及刪除授權(quán)的方法的相關(guān)資料,需要的朋友可以參考下2015-12-12PostgreSQL USAGE和SELECT權(quán)限案例深入分析
這篇文章主要介紹了PostgreSQL USAGE和SELECT權(quán)限案例深入分析,因為項目需求,需要學(xué)習(xí)PostgreSQL,本人之前學(xué)習(xí)過MYSQL,臨時快速上手,盡快的去學(xué)習(xí)項目需要PostgREST2023-04-04mysql xtrabackup 備份恢復(fù)實現(xiàn)分享
Xtrabackup是由percona提供的mysql數(shù)據(jù)庫備份工具,據(jù)官方介紹,這也是世界上惟一一款開源的能夠?qū)nnodb和xtradb數(shù)據(jù)庫進行熱備的工具2012-11-11詳解MySQL如何有效的存儲IP地址及字符串IP和數(shù)值之間如何轉(zhuǎn)換
本文主要介紹了MySQL如何有效的存儲IP地址及字符串IP和數(shù)值之間如何轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01在Windows主機上定時備份遠程VPS(CentOS)數(shù)據(jù)的批處理
我想在自己的 Windows7 下每天/周運行一次備份,就有了這個小工具2012-05-05MySQL中列子查詢與行子查詢操作的學(xué)習(xí)教程
這篇文章主要介紹了MySQL中列子查詢與行子查詢操作的學(xué)習(xí)教程,子查詢是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-12-12