最全mysql數(shù)據(jù)類型梳理匯總
整數(shù)類型
數(shù)值型數(shù)據(jù)類型主要用來存儲數(shù)字,mysql
提供了多種數(shù)值數(shù)據(jù)類型,不同的數(shù)據(jù)類型提供不同的取值范圍,可以存儲的值范圍越大,其所需要的存儲空間也會越大。
mysql
主要提供的整數(shù)類型有TINYINT
、SMALLINT
、MEDIUMINT
、INT
、BIGINT
。整數(shù)類型的屬性字段可以添加AUTO_INCREMENT
自增約束條件。
看下下面兩個表;
- 表一:
mysql
中的整數(shù)型數(shù)據(jù)類型 - 表二、
mysql
不同整數(shù)類型的取值范圍
舉個例子:
year int(4);
該聲明指明,在year
字段中的數(shù)據(jù)一般只顯示4
位數(shù)字的寬度;
注意點:顯示寬度和數(shù)據(jù)類型取值范圍是無關的。顯示寬度只是指明mysql
最大可能顯示的數(shù)字個數(shù),數(shù)值的位數(shù)小于指定的寬度時會由空格填充;如果插入了大于顯示寬度的值,只要該值不超過該類型整數(shù)的取值范圍,數(shù)值依然可以插入,而且能夠顯示出來。
例如:向year
字段插入一個數(shù)值12345
,當使用select
查詢該列值的時候,mysql
顯示的將是完整的帶有5位數(shù)字的12345
,而不是4位數(shù)字的值。
其他整數(shù)型數(shù)據(jù)類型也可以在定義表結構時指定所需要的顯示寬度,如果不指定,則系統(tǒng)為每一種類型指定默認的寬度。
不同的整數(shù)類型有不同的取值范圍,并且需要不同的存儲空間,因此應該根據(jù)實際需要選擇最合適的類型,這樣有利于提高查詢的效率和節(jié)省存儲空間。整數(shù)類型是不帶小數(shù)部分的數(shù)值,現(xiàn)實生活中很多地方都需要用到帶小數(shù)的數(shù)值。下面我們就來介紹下小數(shù)類型。
注意點:顯示寬度只用于顯示,并不能限制取值范圍和占用空間。
浮點數(shù)類型和定點數(shù)類型
mysql
中使用浮點數(shù)和定點數(shù)來表示小數(shù)。
浮點數(shù)類型有兩種:
- 單精度浮點類型(FLOAT)
- 雙精度浮點類型(DOUBLE)
定點數(shù)類型只有一種:
- DECIMAL
浮點數(shù)類型和定點數(shù)類型都可以用(M,N)來表示。其中呢,我們用M
稱為精度,表示總共的位數(shù);N
稱為標度,表示小數(shù)的位數(shù)。
DECIMAL
類型不同于FLOAT
和DOUBLE
,DECIMAL
實際是以串存放的,可能的最大取值范圍和DOUBLRE
一樣,但是其有效的取值范圍由M
和D
的值來決定。怎么說呢?
如果改變M
而固定D
,則其取值范圍將隨著M
的變大而變大。
那么在mysql中,浮點數(shù)類型和定點數(shù)類型的取值范圍有多大呢?
幾乎正常業(yè)務情況下是不可能用完的,因為他們的取值范圍如下:
FLOAT
類型的取值范圍:
- 有符號的取值范圍:-3.402823466E+38 ~-1.175494351E-38
- 無符號的取值范圍:0和1.175494351E-38 ~3.402823466E+38
DOUBLE
類型的取值范圍:
- 有符號的取值范圍:-1.7976931348623157E+308 ~-2.2250738585072014E-308
- 無符號的取值范圍:0和2.2250738585072014E-308~ 1.7976931348623157E+308
注意點:無論是定點數(shù)還是浮點數(shù)類型,如果用戶指定的精度超出精度范圍,則會四舍五入。
可能有點繞,舉個栗子吧:
創(chuàng)建一個數(shù)據(jù)表為yunweijia_1
,字段類型如下;
mysql> create table yunweijia_1 (x float(5,1), y double(5,1), z decimal(5,1)); Query OK, 0 rows affected, 2 warnings (0.04 sec) mysql>
然后我們在這個表中插入一條數(shù)據(jù),sql
語句如下:
mysql> insert into yunweijia_1 values (6.66, 7.77, 8.888); Query OK, 1 row affected, 1 warning (0.01 sec) mysql>
看上面的提示信息,是不是在我們執(zhí)行插入語句的時候,給了一個警告信息,然后我們來看下這個警告信息是什么吧;
mysql> show warnings; +-------+------+----------------------------------------+ | Level | Code | Message | +-------+------+----------------------------------------+ | Note | 1265 | Data truncated for column 'z' at row 1 | +-------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql>
可以看到他提示說,z
字段在插入的時候被截斷了,但是x
和y
截斷就沒有提出警告。
那么查看下結果吧:
mysql> select * from yunweijia_1;
+------+------+------+
| x | y | z |
+------+------+------+
| 6.7 | 7.8 | 8.9 |
+------+------+------+
1 row in set (0.00 sec)
mysql>
可以看到分別都進行了四舍五入,這點需要注意。
FLOAT
和DOUBLE
在不指定精度操作時,默認會按照實際的精度(由計算機硬件和操作系統(tǒng)決定),DECIMAL
若不指定精度則默認為(10,0);
浮點數(shù)相對于定點數(shù)的優(yōu)點是在長度一定的情況下,浮點數(shù)能夠表示更大的數(shù)據(jù)范圍;他的缺點是會引起精度問題;
注意點:在
mysql
中,定點數(shù)以字符串形式存儲,在對精度要求比較高的時候,使用DECIMAL
的類型比較好,另外,兩個浮點數(shù)進行減法和比較運算時,容易出現(xiàn)問題,所以在使用浮點數(shù)時需要注意,并盡量避免做浮點數(shù)比較。
日期與時間類型
mysql
中有多種表示日期的數(shù)據(jù)類型,主要有:
- DATETIME
- DATE
- TIMESTAMP
- TIME
- YEAR
比如說,當只記錄年信息的時候,可以只使用YEAR
類型,而沒有必要使用DATE
。
每一個類型都有合法的取值范圍,當指定確實不合法的值時系統(tǒng)將“零”值插入到數(shù)據(jù)庫中。
YEAR
year
類型是一個單字節(jié)類型,用于表示年,在存儲時只需要1字節(jié)。可以使用各種格式指定year
值,如下:
- 1、以4位字符串或者4位數(shù)字格式表示的
year
,范圍為1901
~2155
。輸入格式為yyyy
或者'yyyy',例如:輸入‘2022’或者2022,插入到數(shù)據(jù)庫的值均為2022。 - 2、以2位字符串格式表示的
year
,范圍為“00”到“99”。“00”~“69”和“70”~“99”范圍的值分別被轉(zhuǎn)換為“2022”~“2069”和“1970”~“1999”范圍的year
值。“0”與“00”的作用相同。插入超過取值范圍的值將被轉(zhuǎn)換成2000
。 - 3、以兩位數(shù)字表示的
YEAR
,范圍為1~99。1~69和70~99范圍的值分別被轉(zhuǎn)換為200·~2069和1970~1999范圍的YEAR
值。和字符相比較而言,這里的0值,將被轉(zhuǎn)換成0000,而不是2000。
注意點:
兩位整數(shù)范圍與兩位字符串范圍稍有不同。例如,插入2000年,有人可能會使用數(shù)字格式的0表示
year
,實際上,插入數(shù)據(jù)庫的值為0000,而不是所希望的2000。只有使用字符串格式的“0”或者“00”,才可以被正確的解釋為2000,。非法YEAR
值將被轉(zhuǎn)換為0000。
栗子:
我們創(chuàng)建一個名為yunweijia_2
的數(shù)據(jù)表,使用以下sql
語句:
mysql> create table yunweijia_2 (y year); Query OK, 0 rows affected (0.04 sec) mysql>
然后我們往表中插入一條數(shù)據(jù);
mysql> insert into yunweijia_2 values(2022), ('2022'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql>
再次嘗試插入一條數(shù)據(jù);
mysql> insert into yunweijia_2 values ('2166'); ERROR 1264 (22003): Out of range value for column 'y' at row 1 mysql>
我們發(fā)現(xiàn)‘2166’超出了YEAR
類型的取值范圍,所以不能插入數(shù)據(jù),這個時候我們看下mysql
數(shù)據(jù)庫中的數(shù)據(jù);
mysql> select * from yunweijia_2; +------+ | y | +------+ | 2022 | | 2022 | +------+ 2 rows in set (0.00 sec) mysql>
栗子:
首先我們先刪除yunweijia_2
數(shù)據(jù)表中的數(shù)據(jù);
mysql> delete from yunweijia_2; Query OK, 2 rows affected (0.01 sec) mysql>
可以看到提示刪除了兩條數(shù)據(jù);
然后我們再插入以下數(shù)據(jù);
mysql> insert into yunweijia_2 values ('0'), ('00'), ('88'), ('22'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql>
然后看下結果是什么:
mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 2000 |
| 2000 |
| 1988 |
| 2022 |
+------+
4 rows in set (0.00 sec)
mysql>
從上面i看到,字符串‘0’和‘00’的作用相同,分別都轉(zhuǎn)換成了2000年;‘88’轉(zhuǎn)換成了‘1988’;‘22’轉(zhuǎn)換成了‘2022’。
栗子:
老規(guī)矩,先刪除表中現(xiàn)有的數(shù)據(jù);
mysql> delete from yunweijia_2; Query OK, 4 rows affected (0.01 sec) mysql>
然后再插入數(shù)據(jù):
mysql> insert into yunweijia_2 values (0), (99), (22); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>
看下結果:
mysql> select * from yunweijia_2;
+------+
| y |
+------+
| 0000 |
| 1999 |
| 2022 |
+------+
3 rows in set (0.00 sec)
mysql>
可以看到,0被轉(zhuǎn)換成了0000,99被轉(zhuǎn)換成了1999,22被轉(zhuǎn)換成了2022。
TIME
time
類型用在只需要時間信息的值,在存儲時需要3字節(jié),格式為HH:MM:SS
。
其中,HH
表示小時,MM
表示分鐘,SS
表示秒。
mysql
中time
類型的取值范圍為-838:59:59~838:59:598,小時部分為什么會這么大呢,這是因為time
類型不僅可以用來表示一天的時間,還可能是某個事件過去的時間或者兩個事件之間的時間間隔。
(1)‘D HH:MM:S’格式的字符串,可以使用下面任何一種“非嚴格”的語法:
- ‘HH:MM:SS’
- ‘HH:MM’
- ‘D HH:MM’
這里的D表示日,可以取0~34的值,在插入數(shù)據(jù)庫時,D被轉(zhuǎn)換成小時保存,格式為“D*24+HH”;
(2)‘HH:MM:SS’格式的、沒有間隔符的字符串或者HHMMSS格式的數(shù)值,假定是有意義的時間。例如:'223344'被理解成‘22:33:44’,但是‘223366’是不合法的(他有一個沒有意義的秒部分),存儲時將變成00:00:00。
注意點:
為
time
列分配簡寫時應該注意,如果沒有冒號,mysql
解釋值時,假定最右邊的兩位表示秒。如果time
值中使用了冒號,則肯定被單做是當天的時間。例如:
11:22 會被
mysql
解釋成 00:11:22'11:22'會被
mysql
解釋成11:22:00
栗子
創(chuàng)建一個名為yunweijia_3
的數(shù)據(jù)表;
mysql> create table yunweijia_3(t time); Query OK, 0 rows affected (0.03 sec) mysql>
往這個表中插入數(shù)據(jù):
mysql> insert into yunweijia_3 values ('10:06:06'), ('22:22'), ('2 10:10'), ('3 00'), ('20'); Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql>
看下表中的數(shù)據(jù):
mysql> select * from yunweijia_3; +----------+ | t | +----------+ | 10:06:06 | | 22:22:00 | | 58:10:00 | | 72:00:00 | | 00:00:20 | +----------+ 5 rows in set (0.00 sec) mysql>
小提示:在使用‘D HH’格式時,小時一定要使用雙位數(shù)值,如果是小于10的小時數(shù),應在前面加0以用來補全雙位數(shù)值。
舉個栗子 :
首先我們刪除數(shù)據(jù)表yunweijia_3
里面的數(shù)據(jù);
mysql> delete from yunweijia_3; Query OK, 5 rows affected (0.01 sec) mysql>
然后再表中插入數(shù)據(jù):
mysql> insert into yunweijia_3 values ('101112'), (111213), ('0'); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>
再次向表中插入一條數(shù)據(jù);
mysql> insert into yunweijia_3 values (107010); ERROR 1292 (22007): Incorrect time value: '107010' for column 't' at row 1 mysql>
可以看到這條數(shù)據(jù)沒有插入成功,我看看下提示信息;
mysql> show warnings; +-------+------+--------------------------------------------------------+ | Level | Code | Message | +-------+------+--------------------------------------------------------+ | Error | 1292 | Incorrect time value: '107010' for column 't' at row 1 | +-------+------+--------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
為什么這次會插入失敗呢,是不是因為我們的分鐘應該是小于60的啊,但是這里是70,所以報錯了。
我們查看下這個數(shù)據(jù)庫中的數(shù)據(jù)現(xiàn)在的展示吧:
mysql> select * from yunweijia_3; +----------+ | t | +----------+ | 10:11:12 | | 11:12:13 | | 00:00:00 | +----------+ 3 rows in set (0.00 sec) mysql>
又舉個栗子:
我們還可以使用系統(tǒng)函數(shù)向time
字段列插入值;
刪除數(shù)據(jù)表yunweijia_3
里面的數(shù)據(jù);
mysql> delete from yunweijia_3; Query OK, 3 rows affected (0.01 sec) mysql>
然后在表中插入數(shù)據(jù);
mysql> insert into yunweijia_3 values (CURRENT_TIME), (NOW()); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql>
查看下數(shù)據(jù)庫中的結果;
mysql> select * from yunweijia_3;
+----------+
| t |
+----------+
| 23:03:41 |
| 23:03:41 |
+----------+
2 rows in set (0.00 sec)mysql>
從結果中可以看到,獲取系統(tǒng)當前的日志插入到time
類型的列中。
到此這篇關于最全mysql數(shù)據(jù)類型梳理匯總的文章就介紹到這了,更多相關mysql數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql 使用inet_aton和inet_ntoa處理ip地址數(shù)據(jù)的實例
下面小編就為大家?guī)硪黄猰ysql 使用inet_aton和inet_ntoa處理ip地址數(shù)據(jù)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04關于Win10下MySQL5.7.17免安裝版基本配置教程(圖文詳解)
這數(shù)據(jù)庫應用是一個應用系統(tǒng)不可或缺的部分,關系型數(shù)據(jù)庫應用大同小異,這里選擇MySQL作為數(shù)據(jù)庫平臺。下面通過本文給大家介紹關于Win10下MySQL5.7.17免安裝版基本配置教程(圖文詳解),需要的朋友可以參考下2017-06-06如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog
這篇文章主要介紹了如何區(qū)分MySQL的innodb_flush_log_at_trx_commit和sync_binlog,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下2021-02-02