MySQL 基础————常用数据类型
引言
從第一次學(xué)習(xí)mysql開(kāi)始,不知道為什么MySQL的數(shù)據(jù)類(lèi)型始終沒(méi)有像Java 一樣深入腦海,對(duì)某些數(shù)據(jù)類(lèi)型的定義和用法,也并不清晰,這篇文章,就好好總結(jié)一番,將MySQL中幾個(gè)常用的數(shù)據(jù)類(lèi)型歸納一下。
一、類(lèi)型選擇的原則
在設(shè)計(jì)表的時(shí)候,首先就是要考慮存儲(chǔ)的數(shù)據(jù)與MySQL的哪種類(lèi)型相吻合,比如,金額,就要用數(shù)字類(lèi)型,最差也要用字符串類(lèi)型,日期可以是date 類(lèi)型,或者也可以是字符串類(lèi)型,考慮這類(lèi)問(wèn)題,其實(shí)只需要考慮某個(gè)數(shù)據(jù)類(lèi)型能否正確的表示將要存儲(chǔ)的數(shù)據(jù)即可。
第二點(diǎn)非常重要原則是:
所選擇的類(lèi)型越簡(jiǎn)單越好,能保存數(shù)值的類(lèi)型越小越好。
?這點(diǎn)不難理解,數(shù)據(jù)類(lèi)型描述了物理硬件存儲(chǔ)數(shù)據(jù)的方式,簡(jiǎn)單的類(lèi)型更快,小的類(lèi)型更省空間,因此,在選擇數(shù)據(jù)類(lèi)型的時(shí)候就要盡可能的越小越簡(jiǎn)單越好,避免存儲(chǔ)或性能上的浪費(fèi)。
二、MySQL常見(jiàn)數(shù)據(jù)類(lèi)型
與 Java 不同的是,MySQL的數(shù)據(jù)類(lèi)型描述的更為抽象化一些。它們總共分為三類(lèi):
數(shù)值型、字符型、日期型
2.1 數(shù)值型
MySQL支持所有標(biāo)準(zhǔn)SQL數(shù)值數(shù)據(jù)類(lèi)型。數(shù)值型可以分為兩大類(lèi):整數(shù)和小數(shù)。
2.1.1 整數(shù)
整型共有 5 種:
| TINYINT | 1 | -128 | 0 | 127 | 255 |
| SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
| MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
| INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
| BIGINT | 8 | -263 | 0 | 263-1 | 264-1 |
從官方文檔上來(lái)看,INTEGER 和 INT 貌似沒(méi)有什么太大的區(qū)別,可以理解為同義詞。從MySQL官網(wǎng)中的說(shuō)明,我們可以得知,SQL標(biāo)準(zhǔn)的整數(shù)類(lèi)型只有 INTEGER(或 INT)和 SMALLINT,而剩下三種,則是MySQL對(duì)標(biāo)準(zhǔn)的一種擴(kuò)展。
符號(hào)的定義是值得注意的點(diǎn),如果不指定 unsigned 關(guān)鍵字,那么默認(rèn)是有符號(hào)類(lèi)型。如果插入的數(shù)據(jù)大于整型的范圍,那么就會(huì)報(bào) out of range 異常,同時(shí)插入臨界值。
整型一般可以不設(shè)置 Length,這個(gè)屬性代表了該類(lèi)型的顯示長(zhǎng)度。
2.1.2 定點(diǎn)數(shù)(Fixed-Point)
定點(diǎn)數(shù)屬于小數(shù)的一種,是一種可以存儲(chǔ)精確小數(shù)的數(shù)據(jù)類(lèi)型。
DECIMAL 和 NUMERIC
這兩個(gè)類(lèi)型用于存儲(chǔ)確切精度的數(shù)據(jù),例如貨幣數(shù)據(jù),當(dāng)然,個(gè)人認(rèn)為在不同的場(chǎng)景下,可以采用最小貨幣單位存儲(chǔ)方式,比如,在數(shù)據(jù)庫(kù)中以整型存儲(chǔ)金額,以分作為單位,并在整個(gè)系統(tǒng)中保持統(tǒng)一。
MySQL中,NUMERIC 是用 DECIMAL 來(lái)實(shí)現(xiàn)的,因此兩者在本質(zhì)上是無(wú)區(qū)別的。
salary DECIMAL(5, 2)
薪資可以使用上面的方式進(jìn)行定義,那么它所表示的范圍就是:-999.99 到 999.99 。前一個(gè)參數(shù)是總位數(shù),后一個(gè)參數(shù)代表小數(shù)保留的位數(shù)。
另外,還有一種特殊的形式 DECIMAL(M) ,它等同于 DECIMAL(M, 0) ,它的意思是沒(méi)有小數(shù)部分。或者干脆不指定任何參數(shù),如果不指定 M 則默認(rèn)為 10。
這樣定義的字段,如果插入的數(shù)據(jù)超過(guò)了限定范圍,那么就會(huì)插入臨界值。
2.1.3 浮點(diǎn)數(shù)(Floating-Point)
FLOAT 和 DOUBLE 是兩個(gè)浮點(diǎn)數(shù)類(lèi)型,前者是單精度占4個(gè)字節(jié),后者是雙精度占8個(gè)字節(jié)。它們都是不精確的數(shù)據(jù)類(lèi)型。
2.2 字符型
2.2.1 短文本 CHAR 和 VARCHAR
MySQL最常用的字符型是 CHAR 和 VARCHAR ,他們有相似處,同時(shí)存取卻也存在差異。
CHAR和 VARCHAR 都需要指定一個(gè)長(zhǎng)度,這個(gè)長(zhǎng)度描述了需要存儲(chǔ)的最大字符個(gè)數(shù),如CHAR(30) 可以存儲(chǔ)最多 30 個(gè)字符,注意,所有單個(gè)漢字都算一個(gè)字符。
CHAR 類(lèi)型以定長(zhǎng)存儲(chǔ),長(zhǎng)度的范圍可以是 0 到 255 之間任意值。如果存儲(chǔ)的字符不夠,那么 MySQL會(huì)為其自動(dòng)以空格填補(bǔ)空間,當(dāng)取出時(shí),又會(huì)為其自動(dòng)去除。
VARCHAR 類(lèi)型以變長(zhǎng)存儲(chǔ),而且長(zhǎng)度范圍可以是 0 到 65535 之間任意值。但其有效最大長(zhǎng)度取決于最大行大小以及字符集。
| '' | '????' | 4 bytes | '' | 1 byte |
| 'ab' | 'ab??' | 4 bytes | 'ab' | 3 bytes |
| 'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
| 'abcdefgh' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
2.2.2 長(zhǎng)文本 TEXT 和 BLOB
BLOB是一個(gè)二進(jìn)制大對(duì)象,可以容納可變數(shù)量的數(shù)據(jù),TEXT 可以存儲(chǔ)較大的文本。
參考官網(wǎng):https://dev.mysql.com/doc/refman/5.7/en/blob.html
2.2.3 ENUM 類(lèi)型
在 MySQL中,枚舉類(lèi)型也屬于字符型,枚舉的值必須是字符串,不區(qū)分大小寫(xiě)。如:
CREATE TABLE enum_t(state ENUM('1', '2', '4') )枚舉類(lèi)型非常適合定義一些記錄狀態(tài)變化的字段,比如訂單狀態(tài),這樣,可以極好的提升數(shù)據(jù)的可維護(hù)性。在官方給出的說(shuō)明中,有如下兩方面。
優(yōu)勢(shì):
1、壓縮了數(shù)據(jù)出現(xiàn)的情況,同時(shí),MySQL會(huì)自動(dòng)將存儲(chǔ)的字符串編碼為數(shù)字,即進(jìn)行了一些優(yōu)化。
2、可讀性的查詢和輸出。MySQL會(huì)結(jié)果集中自動(dòng)將底層存儲(chǔ)的數(shù)字轉(zhuǎn)化回原來(lái)定義的字符串。
需要考慮的問(wèn)題:
1、enum 類(lèi)型內(nèi)部維護(hù)著從 1 開(kāi)始的索引值,每個(gè)字符串枚舉值都對(duì)應(yīng)著一個(gè)正整數(shù)序號(hào)? 1、2、3... ,這也是為什么enum 里的枚舉值必須是字符串的原因,而且官方也不建議枚舉值的字符串和數(shù)字看起來(lái)很像,這樣很容易和索引值混淆,因?yàn)槲覀兺瑯涌梢灾苯邮褂盟饕祵?duì)字段進(jìn)行插入操作:
2、對(duì)枚舉字段使用 order by 子句,會(huì)按照索引順序排序。這和Java 中的枚舉排序基本一致(Java 中是按照枚舉值定義的位置順序來(lái)默認(rèn)排序的)。另外,空字符串排在所有非空字符串前面,NULL 排在其他所有值前面。
2.2.4 SET 類(lèi)型
SET 類(lèi)型可以保存最多64個(gè)成員。與 ENUM 最大的區(qū)別在 SET 類(lèi)型一次可以選取多個(gè)成員,而 ENUM 只能選取一個(gè)。
存儲(chǔ)的值用一個(gè)引號(hào)包裹起來(lái),每個(gè)值中間用逗號(hào)隔開(kāi)注意中間不允許有空格:
'' 'one' 'two' 'one,two'2.3 日期型
參考之前的總結(jié)《MySQL日期類(lèi)型的處理總結(jié)》
值得一提的是,日期類(lèi)型需要用引號(hào)(單雙都可)引起來(lái),換句話說(shuō),我們可以直接將日期類(lèi)型理解為符合日期格式規(guī)范的字符串。在Java 中,我們甚至可以直接以字符串的形式與MySQL進(jìn)行日期類(lèi)型的交互而不會(huì)有任何問(wèn)題。
?
綜上,就是關(guān)于MySQL常用數(shù)據(jù)類(lèi)型的簡(jiǎn)單總結(jié),參考了尚硅谷的MySQL基礎(chǔ)視頻,以及MySQL官網(wǎng)對(duì)數(shù)據(jù)類(lèi)型的解釋:
https://dev.mysql.com/doc/refman/5.7/en/data-types.html
?
總結(jié)
以上是生活随笔為你收集整理的MySQL 基础————常用数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 状态反射在体育运动中的作用_体育运动木地
- 下一篇: Spring Boot————应用启动时