最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數(shù)據(jù)類型詳解

 更新時間:2025年10月19日 13:06:34   作者:景風~  
本文詳細給大家介紹了MySQL數(shù)據(jù)類型的相關(guān)知識,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧

MySQL數(shù)據(jù)類型

數(shù)據(jù)類型的作用:

  • 決定了存儲數(shù)據(jù)時應該開辟的空間大小。
  • 決定了如何識別一個特定的二進制序列。
  • 決定了數(shù)據(jù)的取值范圍。

數(shù)據(jù)類型分類

分類數(shù)據(jù)類型說明
數(shù)值類型
 
BIT(M)位類型:M 指定位數(shù),默認值為 1,范圍為 1–64
BOOL布爾類型:使用 1 表示真,使用 0 表示假
TINYINT [UNSIGNED]占用 1 字節(jié),默認為有符號
SMALLINT [UNSIGNED]占用 2 字節(jié),默認為有符號
MEDIUMINT [UNSIGNED]占用 3 字節(jié),默認為有符號
INT [UNSIGNED]占用 4 字節(jié),默認為有符號
BIGINT [UNSIGNED]占用 8 字節(jié),默認為有符號
FLOAT[(M,D)] [UNSIGNED]M 指定顯示長度,D 指定小數(shù)位數(shù),占用 4 字節(jié)
DOUBLE[(M,D)] [UNSIGNED]M 指定顯示長度,D 指定小數(shù)位數(shù),占用 8 字節(jié)
DECIMAL(M,D) [UNSIGNED]M 指定顯示長度,D 指定小數(shù)位數(shù);每 4 個字節(jié)表示 9 個數(shù)字,小數(shù)點占用 1 字節(jié)
文本、二進制類型
 
CHAR(L)固定長度字符串:L 指定字符串長度,最大為 255
VARCHAR(L)可變長度字符串:L 指定字符串長度上限,最多占用 65535 字節(jié)
BLOB用于存儲二進制數(shù)據(jù)
TEXT用于存儲大文本數(shù)據(jù)
時間日期DATE / DATETIME日期類型:YYYY-MM-DD 格式 / YYYY-MM-DD HH:MM:SS 格式
時間日期TIMESTAMP時間戳:以 YYYY-MM-DD HH:MM:SS 格式進行顯示
字符串類型ENUM枚舉類型:在定義字段時指定取值范圍;只能從成員中選取單個值;存儲空間由成員個數(shù)決定
字符串類型SET集合類型:在定義字段時指定取值范圍;可從成員中選取一個或多個值;存儲空間由成員個數(shù)決定

注:MySQL本身是不支持bool類型的,當把一個數(shù)據(jù)設置成bool類型時,數(shù)據(jù)庫會自動將其轉(zhuǎn)換成tinyint(1)的數(shù)據(jù)類型,其實這個就是變相的bool類型,因為tinyint(1)只有1和0兩種取值,可以分別對應bool類型的true和false。

數(shù)值類型

tinyint類型

有符號tinyint范圍測試

由于tinyint類型占用1字節(jié),因此有符號tinyint的取值范圍為-128~127,插入該范圍內(nèi)的數(shù)據(jù)時都能成功插入。如下:

如果插入的數(shù)據(jù)不在-128~127范圍內(nèi),那么插入數(shù)據(jù)時就會產(chǎn)生報錯。如下:

無符號tinyint范圍測試

由于tinyint類型占用1字節(jié),因此無符號tinyint的取值范圍為0~255,插入該范圍的數(shù)據(jù)時都能成功插入。如下:

如果插入的數(shù)據(jù)不在0~255范圍內(nèi),那么插入數(shù)據(jù)時就會產(chǎn)生報錯。如下:

建議:

  • 盡量不使用unsigned,對于int類型可能存放不下的數(shù)據(jù),int unsigned同樣可能存放不 下,與其如此,還不如設計時,將int類型提升為bigint類型。

bit類型

bit類型的顯示方式

mysql 客戶端默認開啟了 --binary-as-hex。
只要列是二進制類型(BIT / BINARY / VARBINARY / BLOB),客戶端就用十六進制顯示,以避免亂碼。所以 BIT(8) 存了十進制 10,我們看到的就是 0x0A。

bit類型的范圍測試

創(chuàng)建一個表,表當中包含用戶名name和用戶性別gender,其中g(shù)ender的類型可以指定為1位bit類型,因為性別只有男和女兩種取值,使用1個比特位來表示用戶的性別就可以節(jié)省空間。如下:

如果插入gender列的數(shù)據(jù)不是0或1,那么插入數(shù)據(jù)時就會產(chǎn)生報錯。如下:

建議:

  • 雖然MySQL提供了位類型bit,但一般不建議將數(shù)據(jù)類型設置成位類型,除非將來這個數(shù)據(jù)本身就只是給程序看的,并且數(shù)據(jù)本身非常占用資源。
  • 因為查詢位類型數(shù)據(jù)時,默認會按照ASCII碼對應的值進行顯示,這對于將來數(shù)據(jù)庫管理員維護數(shù)據(jù)庫或程序員調(diào)試程序都是不太方便的。

float類型

有符號float范圍測試

float[(m, d)] [unsigned] : M指定顯示長度,d指定小數(shù)位數(shù),占用空間4個字節(jié)

小數(shù):float(4,2)表示的范圍是-99.99 ~ 99.99,MySQL在保存值時會進行四舍五入。

此外,由于MySQL在保存值時會進行四舍五入,因此實際可插入float(4,2)的范圍為-99.994~99.994,如果插入的數(shù)據(jù)不在該范圍內(nèi),那么插入數(shù)據(jù)時就會產(chǎn)生報錯。如下:

有符號float范圍測試

創(chuàng)建一個表,表當中包含一個float(4,2)類型的列,并指定其為無符號類型。

無符號float類型的取值范圍,實際就是把對應有符號float類型中的負數(shù)部分拿走了,因此float(4,2)的取值范圍為0~99.99,實際可插入的范圍是0~99.994。如下:

如果插入的數(shù)據(jù)不在0~99.994范圍內(nèi),那么插入數(shù)據(jù)時就會產(chǎn)生報錯。如下:

為什么這里和tinyint類型的無符號取值不一樣?

整數(shù)類型(如 TINYINT)

  • 有符號 TINYINT:范圍是 -128 ~ 127,總共 256 個值。
  • 無符號 TINYINT:范圍是 0 ~ 255,總共也是 256 個值。

?? 可以看到:總數(shù)相等,只是符號位的解釋不同。MySQL 對整數(shù)采用定長存儲(補碼),有符號與無符號在存儲層面占用 相同的 1 個字節(jié),所以值的“個數(shù)”完全一致。

浮點類型(FLOAT/DOUBLE)

浮點數(shù)遵循 IEEE 754 標準,存儲方式不同于整數(shù):

  • 浮點數(shù)由三部分組成:
    • 符號位(sign bit)
    • 指數(shù)(exponent)
    • 尾數(shù)(mantissa/fraction)
  • 當你使用 UNSIGNED 時,只是告訴 MySQL:不允許負數(shù)。
  • 但浮點的存儲格式本身并不會把“符號位”重新拿來擴展有效數(shù)值范圍。

換句話說:

  • 有符號 FLOAT:能表示負數(shù)和正數(shù),范圍是 -3.402823466E+38 ~ +3.402823466E+38
  • 無符號 FLOAT:范圍只是 0 ~ 3.402823466E+38。

?? 因為 IEEE 754 并沒有定義“把符號位轉(zhuǎn)換成額外的數(shù)值空間”,所以無符號浮點數(shù)的取值范圍不是兩倍,而只是去掉負數(shù)部分

decimal類型

decimal(m, d) [unsigned] : 定點數(shù)m指定長度,d表示小數(shù)點的位數(shù)

創(chuàng)建decimal為(5,2)的表

mysql 8.0以后的版本float和decimal有什么區(qū)別

存儲方式

FLOAT / DOUBLE

  • 存儲為 IEEE 754 二進制浮點數(shù)(單精度/雙精度)。
  • 值是近似的,很多十進制數(shù)不能被精確表示(比如 0.1)。
  • 占用存儲空間較?。?code>FLOAT 4 字節(jié),DOUBLE 8 字節(jié))。

DECIMAL(p,s)

  • 存儲為 精確的十進制數(shù),按字符串拆分存儲再轉(zhuǎn)成定點數(shù)。
  • 能夠完全保持插入時的數(shù)值,不存在浮點誤差。
  • 占用空間取決于 p(精度),一般比浮點類型大。

精度和范圍

  • FLOAT
    • 大約 7 位有效十進制數(shù)字
    • 范圍大,±3.402823466E+38。
  • DECIMAL(p,s)
    • 精度由 p(總位數(shù))和 s(小數(shù)位數(shù))決定。
    • 范圍取決于定義,比如 DECIMAL(20,6) 可支持 20 位數(shù),6 位小數(shù)。
    • 精度完全可控,不存在近似問題。

注:MySQL8.0以后的版本使用float警告信息更嚴格

  • 在 5.7 里,很多 float 精度問題不會提示。
  • 在 8.0 里,MySQL 在插入 out-of-range 或者 DECIMAL ↔ FLOAT 轉(zhuǎn)換時,會給 warning,幫助開發(fā)者發(fā)現(xiàn)潛在風險。

字符串類型

char類型

char(L): 固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255

由于char(2)中最多可存儲2個字符,因此只要插入的字符個數(shù)不超過2個都是能夠成功插入的。如下:

說明: char(2) 表示可以存放兩個字符,可以是字母或漢字,但是不能超過2個, 最多只能是255

好處:

  • 在不同編碼中,一個字符所占的字節(jié)個數(shù)是不同的,比如utf8中一個字符占3個字節(jié),而gbk中一個字符占2個字節(jié)。MySQL限定字符的概念不是字節(jié),這樣用戶就不用關(guān)心復雜的編碼細節(jié)了。

varchar類型

varchar(L): 可變長度字符串,L表示字符長度,最大長度65535個字節(jié)

創(chuàng)建一個表,由于varchar(6)中最多可存儲6個字符,因此只要插入的字符個數(shù)不超過6都是能夠成功插入的。如下:

如果插入的字符個數(shù)超過了6個,那么在插入數(shù)據(jù)時就會產(chǎn)生報錯。如下:

varchar類型可指定的字符個數(shù)上限

關(guān)于varchar(len),len到底是多大,這個len值,和表的編碼密切相關(guān):

  • varchar長度可以指定為0到65535之間的值,但是有1 - 3 個字節(jié)用于記錄數(shù)據(jù)大小,所以說有效字 節(jié)數(shù)是65535-3=65532。
  • 當我們的表的編碼是utf8時,varchar(n)的參數(shù)n最大值是65532/3=21844[因為utf中,一個字符占 用3個字節(jié)],如果編碼是gbk,varchar(n)的參數(shù)n最大是65532/2=32766(因為gbk中,一個字符 占用2字節(jié))。

因此在定義編碼格式為utf8的表時,varchar(L)中的L如果超過了21844,則會產(chǎn)生報錯。如下:

char和varchar比較

實際存儲char(4)varchar(4)char 占用字節(jié)varchar 占用字節(jié)
abcdabcdabcd4*3=124*3+1=13
AAA4*3=121*3+1=4
Abcde??數(shù)據(jù)超過長度數(shù)據(jù)超過長度

char和varchar的區(qū)別如下:

  • char類型可存儲字符上限為255,varchar類型可存儲字符上限與表的編碼格式有關(guān)。
  • char(L)定義后,無論存儲的字符串長度是否到達L,都會開辟用于存儲L個字符的定長空間,如果存儲的字符串長度超過L則會報錯。
  • varchar(L)定義后,會根據(jù)存儲字符串的長度按需開辟空間,并且需要使用1-3字節(jié)的空間用于表示存儲字符串的長度以及其他控制信息,如果存儲的字符串長度超過L則會報錯。

如何選取char和varchar類型?

char和varchar的優(yōu)缺點如下:

  • char類型的數(shù)據(jù)是定長的,因此磁盤空間比較浪費,但是效率高(直接訪問定長的空間)。
  • varchar類型的數(shù)據(jù)是變長的,因此磁盤空間比較節(jié)省,但是效率低(需要先讀取存儲字符串的長度,再訪問指定長度的空間)。

如果要存儲的數(shù)據(jù)是定長的,那就使用char類型進行存儲,比如身份證號碼、手機號、md5等。如果要存儲的數(shù)據(jù)是變長的,那就使用varchar類型進行存儲,比如名字、地址等。

日期和時間類型

常用的日期有如下三個:

  • date :日期 'yyyy-mm-dd' ,占用三字節(jié)
  • datetime 時間日期格式 'yyyy-mm-dd HH:ii:ss' 表示范圍從
  • timestamp :時間戳,從1970年開始的 四字節(jié)

創(chuàng)建一個表,表當中包含date、datetime和timestamp三種時間日期類型的列。

查看表結(jié)構(gòu)可以看到,timestamp類型的t3列是不允許為空的,它的默認值為CURRENT_TIMESTAMP。

但明顯這里的值不是CURRENT_TIMESTAMP,而是NULL;

這是因為MySQL 8.0 不會再自動給 TIMESTAMP 列加上 NOT NULL DEFAULT CURRENT_TIMESTAMP,現(xiàn)在需要 你自己明確指定。如下圖:

插入數(shù)據(jù)后t3就會自動顯示當前的時間戳

更新數(shù)據(jù):

enum和set類型

enum和set類型的區(qū)別如下:

  • 在定義enum字段時需要提供若干個選項的值,在設置enum字段值時只允許選取其中的一個值。
  • 在定義set字段時需要提供若干個選項的值,在設置set字段值時可以選取其中的一個或多個值。

比如人的性別只能從男和女中進行二選一,因此可以定義成enum類型,而人的愛好在提供的選項中可能存在多個,因此可以定義成set類型。

調(diào)查表案例

有一個調(diào)查表votes,需要調(diào)查人的喜好, 比如(登山,游泳,籃球,武術(shù))中去選擇(可以多選), (男,女)[單選]

向表中插入記錄時,被調(diào)查人的性別只能從男和女中進行二選一,被調(diào)查人的愛好可以從提供的若干個選項中進行多選一或多選多,多個愛好之間需要通過英文逗號隔開。

通過數(shù)字設置enum

在插入記錄時,除了通過指明男女來設置性別,還可以通過插入數(shù)字1和2來設置性別。

如下:

根本原因在于,MySQL出于效率考慮,在存儲enum值時實際存儲的都是數(shù)字,enum中提供的選項值依次對應數(shù)字1、2、3、…,最多65535個,因此在設置enum值時可以通過數(shù)字的方式進行設置。

通過數(shù)字設置set

在插入記錄時,除了通過指明多個選項來設置愛好,還可以通過數(shù)字的方式來設置。如下:

set數(shù)字設置的規(guī)則:

建議:

  • 雖然enum和set可以通過數(shù)字的方式進行設置,但嚴重不推薦這種做法,因為這樣的SQL可讀性太差,導致后期維護成本變高。

enum和set查找

如果想要篩選出調(diào)查表中所有男同志的信息,那么直接在篩選時指明gender='男'即可,因為enum類型的值只能多選一。如下:

但如果要篩選出調(diào)查表中愛好包含登山的人的信息就比較麻煩了,如果繼續(xù)使用上述方式,那么最終篩選出來的是愛好僅為登山的人的信息。如下:

這時需要借助find_in_set(str,strlist)函數(shù),該函數(shù)的作用是查詢strlist中是否包含str,如果包含則返回str在strlist中的位置(從1開始),否則返回0。

通過select可以對find_in_set函數(shù)進行驗證,依次查找集合a,b,c中是否包含字符a、b、d,這時在查找字符a和b時就會得到其在集合中的下標,而在查找字符d時就會得到0值。如下:

這時就可以通過select搭配find_in_set函數(shù),來篩選出愛好包含登山的人的信息了。如下:

到此這篇關(guān)于MySQL數(shù)據(jù)類型的文章就介紹到這了,更多相關(guān)mysql數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL表數(shù)據(jù)刪除與清理的最佳實踐

    MySQL表數(shù)據(jù)刪除與清理的最佳實踐

    在MySQL運維中,刪除操作看似簡單,卻隱藏著諸多風險,誤刪表導致數(shù)據(jù)永久丟失、delete全表引發(fā)主從延遲、刪數(shù)據(jù)后磁盤空間不釋放等等,本文基于實際運維場景,詳細講解刪除表、清空表、部分數(shù)據(jù)刪除、分區(qū)表清理四大核心場景的最佳操作方案,需要的朋友可以參考下
    2025-12-12
  • 詳解MySQL中的緩沖池(buffer pool)

    詳解MySQL中的緩沖池(buffer pool)

    這篇文章主要介紹了MySQL中的緩沖池(buffer pool)的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-01-01
  • MySQL索引是啥?不懂就問

    MySQL索引是啥?不懂就問

    索引是幫助數(shù)據(jù)庫高效獲取數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),是基于數(shù)據(jù)表創(chuàng)建的,它包含了一個表中某些列的值以及記錄對應的地址,并且把這些值存在一個數(shù)據(jù)結(jié)構(gòu)中,常見的有使用哈希表、B+樹作為索引
    2021-07-07
  • Mysql根據(jù)某層部門ID查詢所有下級多層子部門的示例

    Mysql根據(jù)某層部門ID查詢所有下級多層子部門的示例

    這篇文章主要介紹了Mysql根據(jù)某層部門ID查詢所有下級多層子部門的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 在MySQL中同時查找兩張表中的數(shù)據(jù)的示例

    在MySQL中同時查找兩張表中的數(shù)據(jù)的示例

    這篇文章主要介紹了在MySQL中同時查找兩張表中的數(shù)據(jù)的示例,即一次查詢操作返回兩張表的結(jié)果,需要的朋友可以參考下
    2015-07-07
  • mysql 存在該記錄則更新,不存在則插入記錄的sql

    mysql 存在該記錄則更新,不存在則插入記錄的sql

    非常不錯的功能,主要用于更新特定的記錄,如果存在這條記錄則更新一下,如果不存在則插入記錄。應用于配置文件等。
    2010-04-04
  • Mysql中的復合查詢詳解

    Mysql中的復合查詢詳解

    這篇文章主要介紹了Mysql中的復合查詢的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • SQL面試題:求時間差之和(有重復不計)

    SQL面試題:求時間差之和(有重復不計)

    這篇文章主要介紹了SQL面試題:求時間差之和(有重復不計),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • mysql優(yōu)化的重要參數(shù) key_buffer_size table_cache

    mysql優(yōu)化的重要參數(shù) key_buffer_size table_cache

    MySQL服務器端的參數(shù)有很多,但是對于大多數(shù)初學者來說,眾多的參數(shù)往往使得我們不知所措,但是哪些參數(shù)是需要我們調(diào)整的,哪些對服務器的性能影響最大呢
    2016-05-05
  • 利用Shell腳本實現(xiàn)遠程MySQL自動查詢

    利用Shell腳本實現(xiàn)遠程MySQL自動查詢

    本篇文章是對利用Shell腳本實現(xiàn)遠程MySQL自動查詢的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論

灵武市| 荔浦县| 马龙县| 义乌市| 科技| 江油市| 临泽县| 湟中县| 班玛县| 香格里拉县| 牙克石市| 博客| 天门市| 巨鹿县| 抚远县| 嘉禾县| 鹤庆县| 临泽县| 寿阳县| 嘉鱼县| 安化县| 保山市| 迁安市| 定襄县| 满城县| 海安县| 阿拉善盟| 舒城县| 桐庐县| 宁德市| 宁海县| 松江区| 宽城| 乐东| 中阳县| 洛浦县| 汨罗市| 新丰县| 广东省| 淮南市| 余干县|