mysql欄位型別有哪些

2022-04-14 16:00:31

mysql欄位型別有5種:1、整數型別,主要用來儲存整數數位,包括INT、BIGINT、TINYINT等;2、浮點數和定點數型別,用於儲存小數,浮點數有FLOAT和DOUBLE,定點數有DECIMAL;3、字串型別,用來儲存字串資料等。

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

資料庫中的每個欄位都應該有適當的資料型別,用於限制或允許該列中儲存的資料。例如,欄位中儲存的為數位,則相應的資料型別應該為數值型別。

如果使用錯誤的資料型別可能會嚴重影響應用程式的功能和效能,所以在設計表時,應該特別重視資料列所用的資料型別。更改包含資料的列不是一件小事,這樣做可能會導致資料丟失。因此,在建立表時必須為每個列設定正確的資料型別和長度。

MySQL 欄位的資料型別有大概可以分為 5 種,分別是整數型別、浮點數型別和定點數型別、日期和時間型別、字串型別、二進位制型別等。

注意:整數型別和浮點數型別可以統稱為數值資料型別。

1、整數型別

整數型別又稱數值型資料,數值型資料型別主要用來儲存整數數位。

MySQL 提供了多種數值型資料型別,不同的資料型別提供不同的取值範圍,可以儲存的值範圍越大,所需的儲存空間也會越大。

MySQL 主要提供的整數型別有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其屬性欄位可以新增 AUTO_INCREMENT 自增約束條件。下表中列出了 MySQL 中的數值型別。

型別名稱說明儲存需求
TINYINT很小的整數1個位元組
SMALLINT小的整數2個宇節
MEDIUMINT中等大小的整數3個位元組
INT (INTEGHR)普通大小的整數4個位元組
BIGINT大整數8個位元組

從上表中可以看到,不同型別的整數儲存所需的位元組數不相同,佔用位元組數最小的是 TINYINT 型別,佔用位元組最大的是 BIGINT 型別,佔用的位元組越多的型別所能表示的數值範圍越大。

根據佔用位元組數可以求出每一種資料型別的取值範圍。例如,TINYINT 需要 1 個位元組(8bit)來儲存,那麼 TINYINT 無符號數的最大值為 28-1,即 255;TINYINT 有符號數的最大值為 27-1,即 127。

2、浮點數和定點數型別

MySQL 中使用浮點數和定點數來表示小數。

浮點型別有兩種,分別是單精度浮點數(FLOAT)和雙精度浮點數(DOUBLE);定點型別只有一種,就是 DECIMAL。

浮點型別和定點型別都可以用(M, D)來表示,其中M稱為精度,表示總共的位數;D稱為標度,表示小數的位數。

浮點數型別的取值範圍為 M(1~255)和 D(1~30,且不能大於 M-2),分別表示顯示寬度和小數位數。M 和 D 在 FLOAT 和DOUBLE 中是可選的,FLOAT 和 DOUBLE 型別將被儲存為硬體所支援的最大精度。DECIMAL 的預設 D 值為 0、M 值為 10。

下表中列出了 MySQL 中的小數型別和儲存需求。

型別名稱說明儲存需求
FLOAT單精度浮點數4 個位元組
DOUBLE雙精度浮點數8 個位元組
DECIMAL (M, D),DEC壓縮的「嚴格」定點數M+2 個位元組

DECIMAL 型別不同於 FLOAT 和 DOUBLE。DOUBLE 實際上是以字串的形式存放的,DECIMAL 可能的最大取值範圍與 DOUBLE 相同,但是有效的取值範圍由 M 和 D 決定。如果改變 M 而固定 D,則取值範圍將隨 M 的變大而變大。

從上表中可以看到,DECIMAL 的儲存空間並不是固定的,而由精度值 M 決定,佔用 M+2 個位元組。

FLOAT 型別的取值範圍如下:

  • 有符號的取值範圍:-3.402823466E+38~-1.175494351E-38。

  • 無符號的取值範圍:0 和 -1.175494351E-38~-3.402823466E+38。

DOUBLE 型別的取值範圍如下:

  • 有符號的取值範圍:-1.7976931348623157E+308~-2.2250738585072014E-308。

  • 無符號的取值範圍:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。

提示:不論是定點還是浮點型別,如果使用者指定的精度超出精度範圍,則會四捨五入進行處理。

FLOAT 和 DOUBLE 在不指定精度時,預設會按照實際的精度(由計算機硬體和作業系統決定),DECIMAL 如果不指定精度,預設為(10,0)。

浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的範圍;缺點是會引起精度問題。

最後再強調一下:在 MySQL 中,定點數以字串形式儲存,在對精度要求比較高的時候(如貨幣、科學資料),使用 DECIMAL 的型別比較好,另外兩個浮點數進行減法和比較運算時也容易出問題,所以在使用浮點數時需要注意,並儘量避免做浮點數比較。

3、日期/時間型別

MySQL 中有多處表示日期的資料型別:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。當只記錄年資訊的時候,可以只使用 YEAR 型別。

每一個型別都有合法的取值範圍,當指定確定不合法的值時,系統將「零」值插入資料庫中。

下表中列出了 MySQL 中的日期與時間型別。

型別名稱日期格式日期範圍儲存需求
YEARYYYY1901 ~ 21551 個位元組
TIMEHH:MM:SS-838:59:59 ~ 838:59:593 個位元組
DATEYYYY-MM-DD1000-01-01 ~ 9999-12-33 個位元組
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:598 個位元組
TIMESTAMPYYYY-MM-DD HH:MM:SS1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC4 個位元組

YEAR 型別

YEAR 型別是一個單位元組型別,用於表示年,在儲存時只需要 1 個位元組。可以使用各種格式指定 YEAR,如下所示:

  • 以 4 位字串或者 4 位數位格式表示的 YEAR,範圍為 '1901'~'2155'。輸入格式為 'YYYY' 或者 YYYY,例如,輸入 '2010' 或 2010,插入資料庫的值均為 2010。

  • 以 2 位字串格式表示的 YEAR,範圍為 '00' 到 '99'。'00'~'69' 和 '70'~'99' 範圍的值分別被轉換為 2000~2069 和 1970~1999 範圍的 YEAR 值。'0' 與 '00' 的作用相同。插入超過取值範圍的值將被轉換為 2000。

  • 以 2 位數位表示的 YEAR,範圍為 1~99。1~99 和 70~99 範圍的值分別被轉換為 2001~2069 和 1970~1999 範圍的 YEAR 值。注意,在這裡 0 值將被轉換為 0000,而不是 2000。

提示:兩位整數範圍與兩位字串範圍稍有不同。例如,插入 3000 年,讀者可能會使用數位格式的 0 表示 YEAR,實際上,插入資料庫的值為 0000,而不是所希望的 3000。只有使用字串格式的 '0' 或 '00',才可以被正確解釋為 3000,非法 YEAR值將被轉換為 0000。

TIME 型別

TIME 型別用於只需要時間資訊的值,在儲存時需要 3 個位元組。格式為 HH:MM:SS。HH 表示小時,MM 表示分鐘,SS 表示秒。

TIME 型別的取值範圍為 -838:59:59~838:59:59,小時部分如此大的原因是 TIME 型別不僅可以用於表示一天的時間(必須小於 24 小時),還可能是某個事件過去的時間或兩個事件之間的時間間隔(可大於 24 小時,或者甚至為負)。

可以使用各種格式指定 TIME 值,如下所示。

  • 'D HH:MM:SS' 格式的字串。還可以使用這些「非嚴格」的語法:'HH:MM:SS'、'HH:MM'、'D HH' 或 'SS'。這裡的 D 表示日,可以取 0~34 之間的值。在插入資料庫時,D 被轉換為小時儲存,格式為 「D*24+HH」。

  • 'HHMMSS' 格式、沒有間隔符的字串或者 HHMMSS 格式的數值,假定是有意義的時間。例如,'101112' 被理解為'10:11:12',但是 '106112' 是不合法的(它有一個沒有意義的分鐘部分),在儲存時將變為 00:00:00。

提示:為 TIME 列分配簡寫值時應注意:如果沒有冒號,MySQL 解釋值時,假定最右邊的兩位表示秒。(MySQL 解釋 TIME 值為過去的時間而不是當前的時間)。例如,讀者可能認為 '1112' 和 1112 表示 11:12:00(即 11 點過 12 分鐘),但MySQL 將它們解釋為 00:11:12(即 11 分 12 秒)。同樣 '12' 和 12 被解釋為00:00:12。相反,TIME 值中如果使用冒號則肯定被看作當天的時間,也就是說,'11:12' 表示 11:12:00,而不是 00:11:12。

DATE 型別

DATE 型別用於僅需要日期值時,沒有時間部分,在儲存時需要 3 個位元組。日期格式為 'YYYY-MM-DD',其中 YYYY 表示年,MM 表示月,DD 表示日。

在給 DATE 型別的欄位賦值時,可以使用字串型別或者數位型別的資料插入,只要符合 DATE 的日期格式即可。如下所示:

  • 以 'YYYY-MM-DD' 或者 'YYYYMMDD' 字元中格式表示的日期,取值範圍為 '1000-01-01'~'9999-12-3'。例如,輸入 '2015-12-31' 或者 '20151231',插入資料庫的日期為2015-12-31。

  • 以 'YY-MM-DD' 或者 'YYMMDD' 字串格式表示日期,在這裡YY表示兩位的年值。MySQL 解釋兩位年值的規則:'00~69' 範圍的年值轉換為 '2000~2069','70~99' 範圍的年值轉換為 '1970~1999'。例如,輸入 '15-12-31',插入資料庫的日期為 2015-12-31;輸入 '991231',插入資料庫的日期為 1999-12-31。

  • 以 YYMMDD 數位格式表示的日期,與前面相似,00~69 範圍的年值轉換為 2000~2069,80~99 範圍的年值轉換為 1980~1999。例如,輸入 151231,插入資料庫的日期為 2015-12-31,輸入 991231,插入資料庫的日期為 1999-12-31。

  • 使用 CURRENT_DATE 或者 NOW(),插入當前系統日期。

提示:MySQL 允許「不嚴格」語法:任何標點符號都可以用作日期部分之間的間隔符。例如,'98-11-31'、'98.11.31'、'98/11/31'和'98@11@31' 是等價的,這些值也可以正確地插入資料庫。

DATETIME 型別

DATETIME 型別用於需要同時包含日期和時間資訊的值,在儲存時需要 8 個位元組。日期格式為 'YYYY-MM-DD HH:MM:SS',其中 YYYY 表示年,MM 表示月,DD 表示日,HH 表示小時,MM 表示分鐘,SS 表示秒。

在給 DATETIME 型別的欄位賦值時,可以使用字串型別或者數位型別的資料插入,只要符合 DATETIME 的日期格式即可,如下所示。

  • 以 'YYYY-MM-DD HH:MM:SS' 或者 'YYYYMMDDHHMMSS' 字串格式表示的日期,取值範圍為 '1000-01-01 00:00:00'~'9999-12-3 23:59:59'。例如,輸入 '2014-12-31 05:05:05' 或者 '20141231050505’,插入資料庫的 DATETIME 值都為 2014-12-31 05:05:05。

  • 以 'YY-MM-DD HH:MM:SS' 或者 'YYMMDDHHMMSS' 字串格式表示的日期,在這裡 YY 表示兩位的年值。與前面相同,'00~79' 範圍的年值轉換為 '2000~2079','80~99' 範圍的年值轉換為 '1980~1999'。例如,輸入 '14-12-31 05:05:05',插入資料庫的 DATETIME 為 2014-12-31 05:05:05;輸入 141231050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05。

  • 以 YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 數位格式表示的日期和時間。例如,輸入 20141231050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05;輸入 140505050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05。

提示:MySQL 允許「不嚴格」語法:任何標點符號都可用作日期部分或時間部分之間的間隔符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+35'、'98/12/31 11*30*45' 和 '98@12@31 11^30^45' 是等價的,這些值都可以正確地插入資料庫。

TIMESTAMP 型別

TIMESTAMP 的顯示格式與 DATETIME 相同,顯示寬度固定在 19 個字元,日期格式為 YYYY-MM-DD HH:MM:SS,在儲存時需要 4 個位元組。但是 TIMESTAMP 列的取值範圍小於 DATETIME 的取值範圍,為 '1970-01-01 00:00:01'UTC~'2038-01-19 03:14:07'UTC。在插入資料時,要保證在合法的取值範圍內。

提示:協調世界時(英:Coordinated Universal Time,法:Temps Universel Coordonné)又稱為世界統一時間、世界標準時間、國際協調時間。英文(CUT)和法文(TUC)的縮寫不同,作為妥協,簡稱 UTC。

TIMESTAMP 與 DATETIME 除了儲存位元組和支援的範圍不同外,還有一個最大的區別是:

  • DATETIME 在儲存日期資料時,按實際輸入的格式儲存,即輸入什麼就儲存什麼,與時區無關;

  • 而 TIMESTAMP 值的儲存是以 UTC(世界標準時間)格式儲存的,儲存時對當前時區進行轉換,檢索時再轉換回當前時區。即查詢時,根據當前時區的不同,顯示的時間值是不同的。

提示:如果為一個 DATETIME 或 TIMESTAMP 物件分配一個 DATE 值,結果值的時間部分被設定為 '00:00:00',因此 DATE 值未包含時間資訊。如果為一個 DATE 物件分配一個 DATETIME 或 TIMESTAMP 值,結果值的時間部分被刪除,因此DATE 值未包含時間資訊。

4、字串型別

字串型別用來儲存字串資料,還可以儲存圖片和聲音的二進位制資料。字串可以區分或者不區分大小寫的串比較,還可以進行正規表示式的匹配查詢。

MySQL 中的字串型別有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。

下表中列出了 MySQL 中的字串資料型別,括號中的M表示可以為其指定長度。

型別名稱說明儲存需求
CHAR(M)固定長度非二進位制字串M 位元組,1<=M<=255
VARCHAR(M)變長非二進位制字串L+1位元組,在此,L< = M和 1<=M<=255
TINYTEXT非常小的非二進位制字串L+1位元組,在此,L<2^8
TEXT小的非二進位制字串L+2位元組,在此,L<2^16
MEDIUMTEXT中等大小的非二進位制字串L+3位元組,在此,L<2^24
LONGTEXT大的非二進位制字串L+4位元組,在此,L<2^32
ENUM列舉型別,只能有一個列舉字串值1或2個位元組,取決於列舉值的數目 (最大值為65535)
SET一個設定,字串物件可以有零個或 多個SET成員1、2、3、4或8個位元組,取決於集合 成員的數量(最多64個成員)

VARCHAR 和 TEXT 型別是變長型別,其儲存需求取決於列值的實際長度(在前面的表格中用 L 表示),而不是取決於型別的最大可能尺寸。

例如,一個 VARCHAR(10) 列能儲存一個最大長度為 10 個字元的字串,實際的儲存需要字串的長度 L 加上一個位元組以記錄字串的長度。對於字元 「abcd」,L 是 4,而儲存要求 5 個位元組。

CHAR 和 VARCHAR 型別

CHAR(M) 為固定長度字串,在定義時指定字串列長。當儲存時,在右側填充空格以達到指定的長度。M 表示列的長度,範圍是 0~255 個字元。

例如,CHAR(4) 定義了一個固定長度的字串列,包含的字元個數最大為 4。當檢索到 CHAR 值時,尾部的空格將被刪除。

VARCHAR(M) 是長度可變的字串,M 表示最大列的長度,M 的範圍是 0~65535。VARCHAR 的最大實際長度由最長的行的大小和使用的字元集確定,而實際佔用的空間為字串的實際長度加 1。

例如,VARCHAR(50) 定義了一個最大長度為 50 的字串,如果插入的字串只有 10 個字元,則實際儲存的字串為 10 個字元和一個字串結束字元。VARCHAR 在值儲存和檢索時尾部的空格仍保留。

TEXT 型別

TEXT 列儲存非二進位制字串,如文章內容、評論等。當儲存或查詢 TEXT 列的值時,不刪除尾部空格。

TEXT 型別分為 4 種:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 型別的儲存空間和資料長度不同。

  • TINYTEXT 表示長度為 255(28-1)字元的 TEXT 列。

  • TEXT 表示長度為 65535(216-1)字元的 TEXT 列。

  • MEDIUMTEXT 表示長度為 16777215(224-1)字元的 TEXT 列。

  • LONGTEXT 表示長度為 4294967295 或 4GB(232-1)字元的 TEXT 列。

ENUM 型別

ENUM 是一個字串物件,值為表建立時列規定中列舉的一列值。其語法格式如下:

<欄位名> ENUM( '值1', '值1', …, '值n' )

欄位名指將要定義的欄位,值 n 指列舉列表中第 n 個值。

ENUM 型別的欄位在取值時,能在指定的列舉列表中獲取,而且一次只能取一個。如果建立的成員中有空格,尾部的空格將自動被刪除。

ENUM 值在內部用整數表示,每個列舉值均有一個索引值;列表值所允許的成員值從 1 開始編號,MySQL 儲存的就是這個索引編號,列舉最多可以有 65535 個元素。

SET 型別

SET 是一個字串的物件,可以有零或多個值,SET 列最多可以有 64 個成員,值為表建立時規定的一列值。指定包括多個 SET 成員的 SET 列值時,各成員之間用逗號,隔開,語法格式如下:

SET( '值1', '值2', …, '值n' )

與 ENUM 型別相同,SET 值在內部用整數表示,列表中每個值都有一個索引編號。當建立表時,SET 成員值的尾部空格將自動刪除。

但與 ENUM 型別不同的是,ENUM 型別的欄位只能從定義的列值中選擇一個值插入,而 SET 型別的列可從定義的列值中選擇多個字元的聯合。

提示:如果插入 SET 欄位中的列值有重複,則 MySQL 自動刪除重複的值;插入 SET 欄位的值的順序並不重要,MySQL 會在存入資料庫時,按照定義的順序顯示;如果插入了不正確的值,預設情況下,MySQL 將忽視這些值,給出警告。

5、二進位制型別

MySQL 支援兩類字元型資料:文字字串和二進位制字串。上節《MySQL字串型別》我們講了文字字串,這節我們來講解二進位制字串。

二進位制字串型別有時候也直接被稱為「二進位制型別」。

MySQL 中的二進位制字串有 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

下表中列出了 MySQL 中的二進位制資料型別,括號中的M表示可以為其指定長度。

型別名稱說明儲存需求
BIT(M)位欄位型別大約 (M+7)/8 位元組
BINARY(M)固定長度二進位制字串M 位元組
VARBINARY (M)可變長度二進位制字串M+1 位元組
TINYBLOB (M)非常小的BLOBL+1 位元組,在此,L<2^8
BLOB (M)小 BLOBL+2 位元組,在此,L<2^16
MEDIUMBLOB (M)中等大小的BLOBL+3 位元組,在此,L<2^24
LONGBLOB (M)非常大的BLOBL+4 位元組,在此,L<2^32

BIT 型別

位欄位型別。M 表示每個值的位數,範圍為 1~64。如果 M 被省略,預設值為 1。如果為 BIT(M) 列分配的值的長度小於 M 位,在值的左邊用 0 填充。例如,為 BIT(6) 列分配一個值 b'101',其效果與分配 b'000101' 相同。

BIT 資料型別用來儲存位欄位值,例如以二進位制的形式儲存資料 13,13 的二進位制形式為 1101,在這裡需要位數至少為 4 位的 BIT 型別,即可以定義列型別為 BIT(4)。大於二進位制 1111 的資料是不能插入 BIT(4) 型別的欄位中的。

提示:預設情況下,MySQL 不可以插入超出該列允許範圍的值,因而插入資料時要確保插入的值在指定的範圍內。

BINARY 和 VARBINARY 型別

BINARY 和 VARBINARY 型別類似於 CHAR 和 VARCHAR,不同的是它們包含二進位制位元組字串。使用的語法格式如下:

列名稱 BINARY(M) 或者 VARBINARY(M)

BINARY 型別的長度是固定的,指定長度後,不足最大長度的,將在它們右邊填充 「\0」 補齊,以達到指定長度。例如,指定列資料型別為 BINARY(3),當插入 a 時,儲存的內容實際為 「\a0\0」,當插入 ab 時,實際儲存的內容為「ab\0」,無論儲存的內容是否達到指定的長度,儲存空間均為指定的值 M。

VARBINARY 型別的長度是可變的,指定好長度之後,長度可以在 0 到最大值之間。例如,指定列資料型別為 VARBINARY(20),如果插入的值長度只有 10,則實際儲存空間為 10 加 1,實際佔用的空間為字串的實際長度加 1。

BLOB 型別

BLOB 是一個二進位制的物件,用來儲存可變數量的資料。BLOB 型別分為 4 種:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB

【相關推薦:】

以上就是mysql欄位型別有哪些的詳細內容,更多請關注TW511.COM其它相關文章!