您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“MySQL數(shù)據(jù)類型有什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
嚴(yán)格數(shù)值類型(INTEGER
、SMALLINT
、DECIMAL
和 NUMERIC
)
近似數(shù)值數(shù)據(jù)類型(FLOAT
、REAL
和 DOUBLE PRECISION
)
MySQL中數(shù)值類型:
整數(shù)類型 | 字節(jié) | 最小值 | 最大值 |
TINYINT | 1 | 有符號(hào)-128 無(wú)符號(hào) 0 | 有符號(hào) 127 無(wú)符號(hào) 255 |
SMALLINT | 2 | 有符號(hào)-32768 無(wú)符號(hào) 0 | 有符號(hào) 32767 無(wú)符號(hào) 65535 |
MEDIUMINT | 3 | 有符號(hào)-8388608 無(wú)符號(hào) 0 | 有符號(hào) 8388607 無(wú)符號(hào) 1677215 |
INT、INTEGER | 4 | 有符號(hào)-2147483648 無(wú)符號(hào) 0 | 有符號(hào) 2147483647 無(wú)符號(hào) 4294967295 |
BIGINT | 8 | 有符號(hào)-9223372036854775808 無(wú)符號(hào) 0 | 有符號(hào) 9223372036854775807 無(wú)符號(hào) 18446744073709551615 |
浮點(diǎn)數(shù)類型 | 字節(jié) | 最小值 | 最大值 |
FLOAT | 4 | ±1.175494351E-38 | ±3.402823466E+38 |
DOUBLE | 8 | ±2.2250738585072014E-308 | ±1.7976931348623157E+308 |
定點(diǎn)數(shù)類型 | 字節(jié) | 描述 | |
DEC(M,D), DECIMAL(M,D) | M+2 | 最大取值范圍與 DOUBLE 相同,給定 DECIMAL 的有效取值范圍由 M 和 D 決定 | |
位類型 | 字節(jié) | 最小值 | 最大值 |
BIT(M) | 1~8 | BIT(1) | BIT(64) |
浮點(diǎn)數(shù)如果不寫(xiě)精度和標(biāo)度,則會(huì)按照實(shí)際精度值顯示,如果有精度和標(biāo)度,則會(huì)自動(dòng)將四舍五入后的結(jié)果插入,系統(tǒng)不會(huì)報(bào)錯(cuò);定點(diǎn)數(shù)如果不寫(xiě)精度和標(biāo)度,則按照默認(rèn)值 decimal(10,0)
來(lái)進(jìn)行操作,并且如果數(shù)據(jù)超越了精度和標(biāo)度值,系統(tǒng)則會(huì)報(bào)錯(cuò)。
BIT(位)類型:范圍從1-64,如果不寫(xiě),默認(rèn)為1位,對(duì)于此字段,直接使用select命令將不會(huì)看到結(jié)果,可以用bin()(顯示為二進(jìn)制格式)或者h(yuǎn)ex()(顯示為16進(jìn)制格式)函數(shù)進(jìn)行讀取
例:
mysql> desc t2; +-------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+-------+ | id | bit(1) | YES | | NULL | | +-------+--------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> insert into t2 values(1); Query OK, 1 row affected (0.05 sec) mysql> select * from t2; +------+ | id | +------+ | | +------+ 1 row in set (0.00 sec) mysql> select bin(id),hex(id) from t2; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | +---------+---------+ 1 row in set (0.03 sec)
bit
類型數(shù)據(jù)插入時(shí),首先將值轉(zhuǎn)換為二進(jìn)制,如果允許,則進(jìn)行插入,如果位數(shù)小于實(shí)際定義的位數(shù),則插入失敗。
例:如果在剛剛的那張表中插入2,實(shí)際轉(zhuǎn)換為二進(jìn)制為10,超出了bit(1)
的實(shí)際定義位數(shù),就會(huì)報(bào)異常,將id定義為bit(2),在插入,就會(huì)成功
mysql> insert into t2 values(2); ERROR 1406 (22001): Data too long for column 'id' at row 1 mysql> alter table t2 modify id bit(2); Query OK, 1 row affected (0.67 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t2 values(2); Query OK, 1 row affected (0.03 sec) mysql> select bin(id),hex(id) from t2; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | | 10 | 2 | +---------+---------+ 2 rows in set (0.00 sec)
日期和時(shí)間類型 | 字節(jié) | 最小值 | 最大值 |
DATE | 4 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 19700101080001 | 2038 年的某個(gè)時(shí)刻 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
DATE
:用來(lái)表示年月日
DATETIME
:用來(lái)表示年月日時(shí)分秒(支持插入格式:2007-9-3 12:10:10'、'2007/9/3 12+10+10'、'20070903121010'、20070903121010 等)
TIME
:只用來(lái)表示時(shí)分秒
TIMESTAMP
:經(jīng)常插入或者更新日期為當(dāng)前系統(tǒng)時(shí)間
YEAR
:表示年
例1:創(chuàng)建時(shí)間表(dt),字段分別為 date、time、datetime 三種日期類型,并插入數(shù)值,查看顯示結(jié)果
mysql> create table dt(d date,t time,dt datetime); Query OK, 0 rows affected (0.23 sec) mysql> insert into dt values(now(),now(),now()); Query OK, 1 row affected, 1 warning (0.05 sec) mysql> select * from dt; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2021-05-13 | 10:14:07 | 2021-05-13 10:14:07 | +------------+----------+---------------------+ 1 row in set (0.00 sec)
例2:創(chuàng)建測(cè)試表t,字段id1為T(mén)IMESTAMP類型,插入空值,并顯示
mysql> create table t(id1 timestamp); Query OK, 0 rows affected (0.22 sec) mysql> insert into t values(null); Query OK, 1 row affected (0.05 sec) mysql> select * from t; +---------------------+ | id1 | +---------------------+ | 2021-05-13 10:18:05 | +---------------------+ 1 row in set (0.00 sec)
可以發(fā)現(xiàn),系統(tǒng)給 id1 自動(dòng)創(chuàng)建了默認(rèn)值 CURRENT_TIMESTAMP
(系統(tǒng)日期)。(注意,MySQL
只給表中的第一個(gè)TIMESTAMP
字段設(shè)置默認(rèn)值為系統(tǒng)日期,如果有第二個(gè)TIMESTAMP
類型,則默認(rèn)值設(shè)置為0值)
例3:解釋如上說(shuō)明
mysql> alter table t add column id2 timestamp; Query OK, 0 rows affected (0.48 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table t \G; *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ERROR: No query specified
字符串類型 | 字節(jié) | 描述及存儲(chǔ)需求 |
CHAR(M) | M | M 為 0~255 之間的整數(shù) |
VARCHAR(M) | M 為 0~65535 之間的整數(shù),值的長(zhǎng)度+1 個(gè)字節(jié) | |
TINYBLOB | 允許長(zhǎng)度 0~255 字節(jié),值的長(zhǎng)度+1 個(gè)字節(jié) | |
BLOB | 允許長(zhǎng)度 0~65535 字節(jié),值的長(zhǎng)度+2 個(gè)字節(jié) | |
MEDIUMBLOB | 允許長(zhǎng)度 0~167772150 字節(jié),值的長(zhǎng)度+3 個(gè)字節(jié) | |
LONGBLOB | 允許長(zhǎng)度 0~4294967295 字節(jié),值的長(zhǎng)度+4 個(gè)字節(jié) | |
TINYTEXT | 允許長(zhǎng)度 0~255 字節(jié),值的長(zhǎng)度+2 個(gè)字節(jié) | |
TEXT | 允許長(zhǎng)度 0~65535 字節(jié),值的長(zhǎng)度+2 個(gè)字節(jié) | |
MEDIUMTEXT | 允許長(zhǎng)度 0~167772150 字節(jié),值的長(zhǎng)度+3 個(gè)字節(jié) | |
LONGTEXT | 允許長(zhǎng)度 0~4294967295 字節(jié),值的長(zhǎng)度+4 個(gè)字節(jié) | |
VARBINARY(M) | 允許長(zhǎng)度 0~M 個(gè)字節(jié)的變長(zhǎng)字節(jié)字符串,值的長(zhǎng)度+1 個(gè)字節(jié) | |
BINARY(M) | M | 允許長(zhǎng)度 0~M 個(gè)字節(jié)的定長(zhǎng)字節(jié)字符串 |
CHAR
:固定長(zhǎng)度,在檢索時(shí),會(huì)刪除尾部的空格
VARCHAR
:可變長(zhǎng)字符串,在檢索時(shí),會(huì)保留這些空格
例:
mysql> create table varc(v varchar(4),c char(4)); Query OK, 0 rows affected (0.20 sec) mysql> insert into varc values('abc ','abc '); Query OK, 1 row affected (0.03 sec) mysql> select length(v),length(c) from varc; +-----------+-----------+ | length(v) | length(c) | +-----------+-----------+ | 4 | 3 | +-----------+-----------+ 1 row in set (0.01 sec) mysql> select concat(v,'+'),concat(c,'+') from varc; +---------------+---------------+ | concat(v,'+') | concat(c,'+') | +---------------+---------------+ | abc + | abc+ | +---------------+---------------+ 1 row in set (0.00 sec)
BINARY
:類似于char
,但他是二進(jìn)制字符串
VARBINARY
:類似于varchar
,單他是存儲(chǔ)二進(jìn)制字符串
例:
mysql> create table bina(c binary(3)); Query OK, 0 rows affected (0.22 sec) mysql> insert into t set c='a'; ERROR 1054 (42S22): Unknown column 'c' in 'field list' mysql> insert into bina set c='a'; Query OK, 1 row affected (0.05 sec) mysql> select *,hex(c),c='a',c='a\0',c='a\0\0' from bina; +------+--------+-------+---------+-----------+ | c | hex(c) | c='a' | c='a\0' | c='a\0\0' | +------+--------+-------+---------+-----------+ | a | 610000 | 0 | 0 | 1 | +------+--------+-------+---------+-----------+ 1 row in set (0.00 sec)
可以發(fā)現(xiàn),當(dāng)保存 BINARY
值時(shí),在值的最后通過(guò)填充“0x00”(零字節(jié))以達(dá)到指定的字段定義長(zhǎng)度。從上例中看出,對(duì)于一個(gè) BINARY(3)
列,當(dāng)插入時(shí)'a'變?yōu)?#39;a\0\0'
ENUM
:對(duì) 1~255 個(gè)成員的枚舉需要 1 個(gè)字節(jié)存儲(chǔ);對(duì)于 255~65535 個(gè)成員,需要 2 個(gè)字節(jié)存儲(chǔ)。
例:
mysql> create table gend(gender enum('M','F')); Query OK, 0 rows affected (0.20 sec) mysql> insert into gend values('M'),('F'),('1'),(null); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from gend; +--------+ | gender | +--------+ | M | | F | | M | | NULL | +--------+ 4 rows in set (0.00 sec)
由此可以看出,枚舉類型的插入值得時(shí)候,是忽略大小寫(xiě)的,初始下標(biāo)從1開(kāi)始;查詢的時(shí)候會(huì)轉(zhuǎn)換為大寫(xiě),也可以插入空(null)
SET
:字符串對(duì)象,里面可以包含64個(gè)成員,成員不同,存儲(chǔ)上也有所不同
1~8 成員的集合,占 1 個(gè)字節(jié)。
9~16 成員的集合,占 2 個(gè)字節(jié)。
17~24 成員的集合,占 3 個(gè)字節(jié)。
25~32 成員的集合,占 4 個(gè)字節(jié)。
33~64 成員的集合,占 8 個(gè)字節(jié)。Set
和EMUN
區(qū)別在于,Set一次可以選則多個(gè)成員,而ENUM則只能選擇一個(gè)
例:
mysql> create table st(col set('a','b','c','d')); Query OK, 0 rows affected (0.20 sec) mysql> insert into st values('a,b'),('a,d,a'),('a,c'),('a'); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> insert into st values('f'); ERROR 1265 (01000): Data truncated for column 'col' at row 1 mysql> insert into st values(null); Query OK, 1 row affected (0.03 sec) mysql> select * from st; +------+ | col | +------+ | a,b | | a,d | | a,c | | a | | NULL | +------+ 5 rows in set (0.00 sec)
由此可以看出,set是可以插入多個(gè)成員的,也可以插入null,插入不存在的定義列時(shí),會(huì)報(bào)異常插入失敗
“MySQL數(shù)據(jù)類型有什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。