Mysql中的數(shù)據(jù)類(lèi)型用法及解讀
1.1數(shù)據(jù)類(lèi)型分類(lèi)
MySQL 數(shù)據(jù)類(lèi)型可以分為三大類(lèi):
- 數(shù)值類(lèi)型:包括整數(shù)類(lèi)型、浮點(diǎn)類(lèi)型、定點(diǎn)類(lèi)型等。
- 字符串類(lèi)型:包括
CHAR
、VARCHAR
、TEXT
等。 - 日期和時(shí)間類(lèi)型:包括
DATE
、DATETIME
、TIMESTAMP
等。
1.2 數(shù)值類(lèi)型
數(shù)值類(lèi)型在 MySQL 中主要有整型和小數(shù)型兩種類(lèi)型。
1.2.1 tinyint 類(lèi)型
tinyint
類(lèi)型是一個(gè)小的整數(shù)類(lèi)型,通常用于存儲(chǔ)小范圍的整數(shù)。
范圍:
- 有符號(hào):-128 到 127
- 無(wú)符號(hào):0 到 255
- 如果插入超出該范圍的值,MySQL 會(huì)報(bào)錯(cuò)。
示例:
CREATE TABLE tt1 (num tinyint); INSERT INTO tt1 VALUES(1); -- 成功插入 INSERT INTO tt1 VALUES(128); -- 報(bào)錯(cuò),超出范圍
有符號(hào)正數(shù):
有符號(hào)負(fù)數(shù):
無(wú)符號(hào)數(shù):
1.2.2 bit 類(lèi)型
bit
類(lèi)型用于存儲(chǔ)位字段,可以存儲(chǔ)二進(jìn)制數(shù)據(jù)。
示例:
CREATE TABLE tt4 (id INT, a BIT(8)); INSERT INTO tt4 VALUES(10, 10); -- 存入10,顯示可能是位二進(jìn)制值
(bit[(M)] : 位字段類(lèi)型。M表示每個(gè)值的位數(shù),范圍從1到64。如果M被忽略,默認(rèn)為1。)
- 你可以定義存儲(chǔ)的位數(shù),例如
bit(8)
表示存儲(chǔ) 8 位的二進(jìn)制數(shù)。 - 默認(rèn)情況下,
bit
類(lèi)型在存儲(chǔ)時(shí)會(huì)顯示為 ASCII 字符。
注:bit字段在顯示時(shí),是按照ASCII碼對(duì)應(yīng)的值顯示
1.2.3 小數(shù)類(lèi)型
1.2.3.1 float 類(lèi)型
float
類(lèi)型用于存儲(chǔ)浮動(dòng)的小數(shù)值,支持四舍五入。
- 你可以通過(guò)
float(M, D)
來(lái)定義精度和小數(shù)位數(shù),其中M
為總位數(shù),D
為小數(shù)位數(shù)。
示例:
CREATE TABLE tt6 (id INT, salary FLOAT(4, 2)); INSERT INTO tt6 VALUES(100, -99.99); -- 成功插入 INSERT INTO tt6 VALUES(101, -99.991); -- 會(huì)進(jìn)行四舍五入,存儲(chǔ)為 -99.99
案例:
小數(shù):float(4,2)表示的范圍是-99.99 ~ 99.99,MySQL在保存值時(shí)會(huì)進(jìn)行四舍五入。
如果是無(wú)符號(hào)數(shù)的float,其中的負(fù)數(shù)部分會(huì)被舍去。例如:
無(wú)符號(hào)小數(shù):float(4,2)表示的范圍是0 ~ 99.99,MySQL在保存值時(shí)會(huì)進(jìn)行四舍五入。
1.2.3.2 decimal 類(lèi)型
decimal
類(lèi)型是定點(diǎn)數(shù),精度更高,適用于需要精確存儲(chǔ)小數(shù)的情況。
decimal(M, D)
表示最多可以存儲(chǔ)M
位數(shù),其中D
位是小數(shù)部分。
示例:
CREATE TABLE tt7 (id INT, salary DECIMAL(5, 2)); INSERT INTO tt7 VALUES(100, 99.99); -- 成功插入
注: decimal類(lèi)型和float類(lèi)型很像,他們都支持四舍五入,他們的無(wú)符號(hào)類(lèi)型都是舍去負(fù)數(shù),但是decimal類(lèi)型的精度比f(wàn)loat類(lèi)型更高。
例如:
1.3 字符串類(lèi)型
1.3.1 char 類(lèi)型
char
是固定長(zhǎng)度的字符串類(lèi)型,適用于存儲(chǔ)長(zhǎng)度固定的字符串?dāng)?shù)據(jù)。
- 長(zhǎng)度
L
最大為 255 字符。
示例:
CREATE TABLE tt9 (id INT, name CHAR(2)); INSERT INTO tt9 VALUES(100, 'ab'); -- 成功插入 INSERT INTO tt9 VALUES(101, '中國(guó)'); -- 成功插入
1.3.2 varchar 類(lèi)型
varchar
是可變長(zhǎng)度的字符串類(lèi)型,適用于存儲(chǔ)長(zhǎng)度不固定的字符串?dāng)?shù)據(jù)。
- 最大長(zhǎng)度是 65535 字節(jié),實(shí)際存儲(chǔ)的長(zhǎng)度取決于字符集。
示例:
CREATE TABLE tt10 (id INT, name VARCHAR(6)); INSERT INTO tt10 VALUES(100, 'hello'); -- 成功插入 INSERT INTO tt10 VALUES(100, '我愛(ài)你,中國(guó)'); -- 成功插入
請(qǐng)思考為什么會(huì)出現(xiàn)這種情況?
原因是:CHAR
和 VARCHAR
類(lèi)型在 MySQL 中存儲(chǔ)的是字符而非字節(jié)。在默認(rèn)的 utf8
字符集下,每個(gè)字符通常占用 3 個(gè)字節(jié)。
由于 VARCHAR
是可變長(zhǎng)度的字符串類(lèi)型,它不僅存儲(chǔ)字符本身,還需要額外的空間來(lái)記錄實(shí)際數(shù)據(jù)的長(zhǎng)度。因此,在 utf8
編碼下,VARCHAR
字段的最大字符數(shù)是 21844。
這個(gè)限制是因?yàn)?VARCHAR
的最大字節(jié)數(shù)為 65535 字節(jié),而每個(gè)字符占用 3 個(gè)字節(jié),再加上存儲(chǔ)長(zhǎng)度的開(kāi)銷(xiāo)(最多 3 個(gè)字節(jié)),因此實(shí)際能存儲(chǔ)的最大字符數(shù)為 65535 / 3 = 21845
,減去存儲(chǔ)長(zhǎng)度所需的空間后,最終可以存儲(chǔ)最多 21844 個(gè)字符。
1.3.3charVSvarchar
如何選擇定長(zhǎng)或變長(zhǎng)字符串?
定長(zhǎng)(CHAR
):
如果數(shù)據(jù)的長(zhǎng)度確定且不會(huì)變化,使用定長(zhǎng)(CHAR
)類(lèi)型更為合適。例如:身份證、手機(jī)號(hào)、MD5 值等。
變長(zhǎng)(VARCHAR
):
如果數(shù)據(jù)的長(zhǎng)度有變化,可以使用變長(zhǎng)(VARCHAR
)類(lèi)型。例如:名字、地址等數(shù)據(jù)。
優(yōu)缺點(diǎn)對(duì)比:
定長(zhǎng)(CHAR
):
優(yōu)點(diǎn):
- 存儲(chǔ)固定長(zhǎng)度的數(shù)據(jù)時(shí)效率高。
- 因?yàn)榭臻g已經(jīng)預(yù)分配,查詢(xún)時(shí)訪問(wèn)速度較快。
缺點(diǎn):
- 存儲(chǔ)短于定義長(zhǎng)度的數(shù)據(jù)時(shí)會(huì)浪費(fèi)空間。
- 例如,
CHAR(10)
存儲(chǔ) 3 個(gè)字符的數(shù)據(jù)時(shí),會(huì)浪費(fèi) 7 個(gè)字符的空間。
變長(zhǎng)(VARCHAR
):
優(yōu)點(diǎn):
- 根據(jù)實(shí)際字符長(zhǎng)度分配空間,節(jié)省存儲(chǔ)。
缺點(diǎn):
- 需要?jiǎng)討B(tài)計(jì)算長(zhǎng)度,相比
CHAR
稍慢。 - 在頻繁查詢(xún)或更新時(shí),效率可能較低
1.4 日期和時(shí)間類(lèi)型
常用的日期和時(shí)間類(lèi)型:
- DATE:存儲(chǔ)日期,格式為
'yyyy-mm-dd'
。 - DATETIME:存儲(chǔ)日期和時(shí)間,格式為
'yyyy-mm-dd HH:ii:ss'
。 - TIMESTAMP:存儲(chǔ)時(shí)間戳,從1970年1月1日開(kāi)始計(jì)算。
1.5 enum 和 set 類(lèi)型
1.5.1 enum 類(lèi)型
enum
類(lèi)型用于存儲(chǔ)“單選”項(xiàng)。每個(gè)選項(xiàng)都有一個(gè)數(shù)字編號(hào),對(duì)應(yīng)存儲(chǔ)在數(shù)據(jù)庫(kù)中的實(shí)際值。
示例:
CREATE TABLE votes (username VARCHAR(30), gender ENUM('男', '女')); INSERT INTO votes VALUES('張三', '男');
enum里面的值默認(rèn)下表從0開(kāi)始,0表示空NULL
1.5.2 set 類(lèi)型
set
類(lèi)型用于存儲(chǔ)“多選”項(xiàng),可以選擇多個(gè)值,值的組合會(huì)以數(shù)字標(biāo)識(shí)。
示例:
CREATE TABLE votes (username VARCHAR(30), hobby SET('登山', '游泳', '籃球', '武術(shù)')); INSERT INTO votes VALUES('雷鋒', '登山,游泳');
愛(ài)好: | 爬山 | 登月 | 打球 | 游泳 | 睡覺(jué) |
6 | 0 | 1 | 1 | 0 | 0 |
5 | 1 | 0 | 1 | 0 | 0 |
原因: SET
類(lèi)型中的值是按二進(jìn)制位存儲(chǔ)的,每個(gè)選項(xiàng)對(duì)應(yīng)一個(gè)二進(jìn)制位。每個(gè)選項(xiàng)的值會(huì)用一個(gè)數(shù)字表示,數(shù)字的每一位代表一個(gè)選項(xiàng)的狀態(tài)(是否選中)。這樣可以節(jié)省存儲(chǔ)空間。
1.6 find_in_set函數(shù)
find_in_set(sub, str_list)
函數(shù)用于查找一個(gè)字符串是否在由逗號(hào)分隔的字符串列表中。
- 如果
sub
在str_list
中,返回其位置(下標(biāo))。 - 如果
sub
不在str_list
中,返回 0。
示例:
find_in_set('a', 'a,b,c')
返回 1,表示'a'
在'a,b,c'
中的第一個(gè)位置。find_in_set('d', 'a,b,c')
返回 0,表示'd'
不在'a,b,c'
中。
同時(shí)它可以讓查找更方便
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql下普通用戶(hù)備份數(shù)據(jù)庫(kù)時(shí)無(wú)lock tables權(quán)限的解決方法
mysql使用普通用戶(hù)備份出現(xiàn)無(wú)lock tables權(quán)限的解決方法,需要的朋友可以參考下。2011-10-10MySQL時(shí)間格式化date_format使用語(yǔ)法
這篇文章主要為大家介紹了MySQL時(shí)間格式化date_format使用語(yǔ)法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05MySQL9.0的兩種部署模式及各個(gè)版本發(fā)布的新功能
本文主要介紹了MySQL9.0的兩種部署模式及各個(gè)版本發(fā)布的新功能,文中通過(guò)圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08