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 中的日期與時間類型。
類型名稱 | 日期格式 | 日期范圍 | 存儲需求 |
---|---|---|---|
YEAR | YYYY | 1901 ~ 2155 | 1 個字節 |
TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3 個字節 |
DATE | YYYY-MM-DD | 1000-01-01?~ 9999-12-3 | 3 個字節 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8 個字節 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1980-01-01 00:00:01 UTC ~ 2040-01-19 03:14:07 UTC | 4 個字節 |
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 |
VARCHAR(M) | 變長非二進制字符串 | L+1字節,在此,L |
TINYTEXT | 非常小的非二進制字符串 | L+1字節,在此,L |
TEXT | 小的非二進制字符串 | L+2字節,在此,L^16 |
MEDIUMTEXT | 中等大小的非二進制字符串 | L+3字節,在此,L |
LONGTEXT | 大的非二進制字符串 | L+4字節,在此,L |
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) | 非常小的BLOB | L+1 字節,在此,L |
BLOB (M) | 小?BLOB | L+2 字節,在此,L |
MEDIUMBLOB (M) | 中等大小的BLOB | L+3 字節,在此,L |
LONGBLOB (M) | 非常大的BLOB | L+4 字節,在此,L |
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 類型的長度是固定的,指定長度后,不足最大長度的,將在它們右邊填充 “ 久久久艹| 久久综合五月丁香久久激情| 久久中文字幕人妻熟av女| 精品久久久久久无码不卡| 久久婷婷国产剧情内射白浆| 热re99久久精品国产99热| 中文字幕一区二区三区久久网站| 一本色道久久88综合日韩精品| 亚洲精品无码专区久久久| 国产激情久久久久影院老熟女| 欧美黑人又粗又大久久久| 欧美与黑人午夜性猛交久久久| 国产精品久久永久免费| 久久久久人妻一区二区三区 | 久久综合给合久久狠狠狠97色| 精品久久久久久无码专区不卡| 无码8090精品久久一区| 精品免费久久久久久久| 久久99精品国产麻豆宅宅| 亚洲国产成人久久精品影视| 久久精品国产亚洲av麻豆蜜芽| 精品久久久久一区二区三区| 伊人色综合久久天天| 伊人久久大香线蕉av不变影院| 色偷偷91久久综合噜噜噜噜| 国产精品美女久久久m| 一本一本久久A久久综合精品 | 精品国产一区二区三区久久久狼| 久久亚洲欧洲国产综合| 亚洲午夜精品久久久久久人妖| 国产午夜福利精品久久2021| 久久精品国产日本波多野结衣 | 精品综合久久久久久97| 一本大道久久东京热无码AV | 中文字幕无码久久精品青草| 久久嫩草影院免费看夜色| 久久青青草原精品国产不卡 | 久久男人Av资源网站无码软件| 久久香蕉超碰97国产精品| 99久久这里只精品国产免费| 伊色综合久久之综合久久|