MySQL数据类型一
關(guān)于MySQL數(shù)據(jù)類型,平時(shí)用的最多的是varchar、datetime、enum。今天好好研究一下MySQL數(shù)據(jù)類型。
轉(zhuǎn)自:https://www.cnblogs.com/Caveolae/p/7058890.html
MySQL支持多種類型,大致可以分為三類:數(shù)值、日期/時(shí)間和字符串(字符)類型。
1.數(shù)值
1.1整數(shù)類型
1.2定點(diǎn)數(shù)
DECIMAL和NUMERIC類型在MySQL中視為相同的類型。它們用于保存必須為確切精度的值,如:DECIMAL(6,2)取值范圍-9999.99~9999.99。
DECIMAL(M,D),M的默認(rèn)取值為10,D默認(rèn)取值為0。如果創(chuàng)建表時(shí),某字段定義為decimal類型不帶任何參數(shù),等同于decimal(10,0)。帶一個(gè)參數(shù)時(shí),D取默認(rèn)值。
M的取值范圍為1~65,取0時(shí)會(huì)被設(shè)為默認(rèn)值,超出范圍會(huì)報(bào)錯(cuò)。
D的取值范圍為0~30,而且必須<=M,超出范圍會(huì)報(bào)錯(cuò)。
1.3浮點(diǎn)數(shù)
float,double和real。他們定義方式為:FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。
1.4BIT
BIT(M)類型允許存儲(chǔ)M位值。M范圍為1~64,默認(rèn)為1。
2.字符串類型字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
2.1、CHAR和VARCHAR類型
CHAR列的長(zhǎng)度固定為創(chuàng)建表時(shí)聲明的長(zhǎng)度。長(zhǎng)度可以為從0到255的任何值。當(dāng)保存CHAR值時(shí),在它們的右邊填充空格以達(dá)到指定的長(zhǎng)度。當(dāng)檢索到CHAR值時(shí),尾部的空格被刪除掉,所以,我們?cè)诖鎯?chǔ)時(shí)字符串右邊不能有空格,即使有,查詢出來(lái)后也會(huì)被刪除。在存儲(chǔ)或檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。所以當(dāng)char類型的字段為唯一值時(shí),添加的值是否已經(jīng)存在以不包含末尾空格(可能有多個(gè)空格)的值確定,比較時(shí)會(huì)在末尾補(bǔ)滿空格后與現(xiàn)已存在的值比較。
VARCHAR列中的值為可變長(zhǎng)字符串。長(zhǎng)度可以指定為0到65,535之間的值。同CHAR對(duì)比,VARCHAR值保存時(shí)只保存需要的字符數(shù),另加一個(gè)字節(jié)來(lái)記錄長(zhǎng)度(如果列聲明的長(zhǎng)度超過(guò)255,則使用兩個(gè)字節(jié))。
VARCHAR值保存時(shí)不進(jìn)行填充。當(dāng)值保存和檢索時(shí)尾部的空格仍保留,符合標(biāo)準(zhǔn)SQL。
如果分配給CHAR或VARCHAR列的值超過(guò)列的最大長(zhǎng)度,則對(duì)值進(jìn)行裁剪以使其適合。如果被裁掉的字符不是空格,則會(huì)產(chǎn)生警告。如果裁剪非空格字符,則會(huì)造成錯(cuò)誤(而不是警告)并通過(guò)使用嚴(yán)格SQL模式禁用值的插入。
下面顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果:
表中最后一行的值只適用在不使用嚴(yán)格模式時(shí);如果MySQL運(yùn)行使用嚴(yán)格模式,超過(guò)列長(zhǎng)度的值不保存,并且會(huì)出現(xiàn)錯(cuò)誤。
因?yàn)榭崭竦脑颍嗤闹荡嫒氲介L(zhǎng)度都足夠的varvhar和char中,取出可能會(huì)不同,比如"a"和"a "。
2.2BINARY和VARBINARY類型
BINARY和VARBINARY類型類似于CHAR和VARCHAR類型,但是不同的是,它們存儲(chǔ)的不是字符串,而是二進(jìn)制串。所以它們沒(méi)有字符集,并且排序和比較基于列值字節(jié)的數(shù)值。
當(dāng)保存BINARY值時(shí),在它們右邊填充0x00(零字節(jié))值以達(dá)到指定長(zhǎng)度。取值時(shí)不刪除尾部的字節(jié)。比較時(shí)所有字節(jié)都很重要(因?yàn)榭崭窈?x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '會(huì)變成'a '。
對(duì)于VARBINARY,插入時(shí)不填充字符,選擇時(shí)不裁剪字節(jié)。比較時(shí)所有字節(jié)都很重要。當(dāng)類型為BINARY的字段為主鍵時(shí),應(yīng)考慮到上面介紹的存儲(chǔ)方式。
2.3BLOB和TEXT類型
BLOB是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù)。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長(zhǎng)度不同。有4種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。這些對(duì)應(yīng)4種BLOB類型,有相同的最大長(zhǎng)度和存儲(chǔ)需求。
BLOB列被視為二進(jìn)制字符串。TEXT列被視為字符字符串,類似CHAR和BINARY。
在TEXT或BLOB列的存儲(chǔ)或檢索過(guò)程中,不存在大小寫轉(zhuǎn)換。
未運(yùn)行在嚴(yán)格模式時(shí),如果你為BLOB或TEXT列分配一個(gè)超過(guò)該列類型的最大長(zhǎng)度的值,值被截取以保證適合。如果截掉的字符不是空格,將會(huì)產(chǎn)生一條警告。使用嚴(yán)格SQL模式,會(huì)產(chǎn)生錯(cuò)誤,并且值將被拒絕而不是截取并給出警告。
在大多數(shù)方面,可以將BLOB列視為能夠足夠大的VARBINARY列。同樣,可以將TEXT列視為VARCHAR列。
BLOB和TEXT在以下幾個(gè)方面不同于VARBINARY和VARCHAR:
當(dāng)保存或檢索BLOB和TEXT列的值時(shí)不刪除尾部空格。(這與VARBINARY和VARCHAR列相同)。
比較時(shí)將用空格對(duì)TEXT進(jìn)行擴(kuò)充以適合比較的對(duì)象,正如CHAR和VARCHAR。
對(duì)于BLOB和TEXT列的索引,必須指定索引前綴的長(zhǎng)度。對(duì)于CHAR和VARCHAR,前綴長(zhǎng)度是可選的。
BLOB和TEXT列不能有默認(rèn)值。
MySQL Connector/ODBC將BLOB值定義為L(zhǎng)ONGVARBINARY,將TEXT值定義為L(zhǎng)ONGVARCHAR。
BLOB或TEXT對(duì)象的最大大小由其類型確定,但在客戶端和服務(wù)器之間實(shí)際可以傳遞的最大值由可用內(nèi)存數(shù)量和通信緩存區(qū)大小確定。你可以通過(guò)更改max_allowed_packet變量的值更改消息緩存區(qū)的大小,但必須同時(shí)修改服務(wù)器和客戶端程序。
每個(gè)BLOB或TEXT值分別由內(nèi)部分配的對(duì)象表示。
它們(TEXT和BLOB同)的長(zhǎng)度:
Tiny:最大長(zhǎng)度255個(gè)字符(2^8-1)
BLOB或TEXT:最大長(zhǎng)度65535個(gè)字符(2^16-1)
Medium:最大長(zhǎng)度16777215個(gè)字符(2^24-1)
LongText 最大長(zhǎng)度4294967295個(gè)字符(2^32-1)
實(shí)際長(zhǎng)度與編碼有關(guān),比如utf-8的會(huì)減半。
2.4ENUM
MySql中的ENUM是一個(gè)字符串對(duì)象,其值來(lái)自表創(chuàng)建時(shí)在列規(guī)定中顯式枚舉的一列值。
可以插入空字符串""和NULL:
如果你將一個(gè)非法值插入ENUM(也就是說(shuō),允許的值列之外的字符串),將插入空字符串以作為特殊錯(cuò)誤值。該字符串與“普通”空字符串不同,該字符串有數(shù)值值0。
如果將ENUM列聲明為允許NULL,NULL值則為該列的一個(gè)有效值,并且默認(rèn)值為NULL。如果ENUM列被聲明為NOT NULL,其默認(rèn)值為允許的值列的第1個(gè)元素。
值的索引規(guī)則如下:
來(lái)自列規(guī)定的允許的值列中的值從1開始編號(hào)。
空字符串錯(cuò)誤值的索引值是0。所以,可以使用下面的SELECT語(yǔ)句來(lái)找出分配了非法ENUM值的行:mysql> SELECT * FROM tbl_name WHERE enum_col=0;
NULL值的索引是NULL。
如下例:
ENUM最多可以有65,535個(gè)元素。當(dāng)創(chuàng)建表時(shí),ENUM成員值的尾部空格將自動(dòng)被刪除。
使用方式:
CREATE TABLE shirts(
name VARCHAR(40),
size ENUM('x-small','small','medium','large','x-large')
);
INSERT INTO shirts(name,size)VALUES('dress shirt','large'),('t-shirt','medium'),('polo shirt','small');
SELECT name,size FROM shirts WHERE size='medium';
UPDATE shirts SET size='small'WHERE size='large';
如果將返回值設(shè)為數(shù)值,將返回索引值,比如講上面的查詢語(yǔ)句改為:
SELECT name,size+0FROM shirts WHERE size='medium';
如果將一個(gè)數(shù)字保存到ENUM列,數(shù)字被視為索引,并且保存的值是該索引對(duì)應(yīng)的枚舉成員(這不適合LOAD DATA,它將所有輸入視為字符串)。不建議使用類似數(shù)字的枚舉值來(lái)定義一個(gè)ENUM列,因?yàn)檫@很容易引起混淆。
ENUM值根據(jù)索引編號(hào)進(jìn)行排序)。例如,對(duì)于ENUM('a','b'),'a'排在'b'前面,但對(duì)于ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,并且NULL值排在所有其它枚舉值前面。要想防止意想不到的結(jié)果,按字母順序規(guī)定ENUM列。還可以使用GROUP BY CAST(col AS CHAR)或GROUP BY CONCAT(col)來(lái)確保按照詞匯對(duì)列進(jìn)行排序而不是用索引數(shù)字。
總結(jié)
以上是生活随笔為你收集整理的MySQL数据类型一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 鞋子臭味怎么快速去除 酒精除臭
- 下一篇: 吃海参的好处和禁忌(吃海带有什么好处)