MYSQL支援常用的資料類型:數值類型、日期/時間類型和字元串(字元)類型。
1.數值類型
數值類型可以分為兩類:整型和實數。對于實數,MYSQL支援确切精度的值(定點數)和近似精度的值(浮點數)。确切精度的數值類型有DECIMAL類型,近似精度的數值類型有單精度(FLOAT)或雙精度(DOUBLE)兩種類型。
(1)整型
整型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 下表展示了各種類型的空間占用以及表示的數值範圍。
類型 | 位元組 | 最小值(帶符号/無符号) | 最大值(帶符号/無符号) |
TINYINT | 1 | -128 | 127 |
255 | |||
SMALLINT | 2 | -32768 | 32767 |
65535 | |||
MEDIUMINT | 3 | -8388608 | 8388607 |
16777215 | |||
INT | 4 | -2147483648 | 2147483647 |
4294967295 | |||
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
18446744073709551616 |
MYSQL 整型可設定一個"width"屬性,這個點很容易讓人混淆。實際上這不是一個精度,隻是告訴用戶端工具顯示多少個字元而已,如INT(11):11表示的不是數值範圍,隻是顯示寬度(告訴互動式工具顯示寬度,如Mysql用戶端)。
上圖的 11代表的是告訴用戶端顯示的寬度。由于MYSQL的内部類型隻支援到秒級的精度,是以可以用BIGINT來存儲精度到毫秒的時間戳。
(2)DECIMAL和NUMRIC(定點數)
定點數也就是DECIMAL型,指的是資料的小數點的位置是固定不變的。也就是說,小數點後面的位數是固定的。
DECIMAL 和NUMRIC在MYSQL中被視為相同的類型。它們用于儲存必須為确切精度的值,例如貨币資料。當聲明該類型的列的時候,可以(并且通常要)指定精度和名額;比如 ,在DECIMAL(M,D )中,M是精度,表示資料的總長度,也就是十進制數的位數,不包括小數點;D是标度,表示小數點後面的數字位數。MYSQL5.1中,M的範圍是1-65,D的範圍是0到30且不能大于M。例如
price DECIMAL(5,2) 5代表精度,2代表标度,即 總長度為5,小數為2位。
在MYSQL5.1中以二進制格式儲存DECIMAL和NUMRIC的值。如果值太大超出了BIGINT的範圍,可以用DECIMAL來存儲整型。
定點數表達發的缺點在于其形式過于死闆,固定的小數點位置決定了固定位數的整數部分和小數部分,不利于同時表達特别大的數或者特别小的數。
(3)FLOAT和DOUBLE類型(浮點數)
浮點數(floating-point number )是屬于有理數中某個特定子集的數表示法,在計算機中用于近似的表示任意某個實數。具體來說,這個實數是由一個整數或定點數(即位數)乘以某個基數(計算機中通常是2)的整數次幂(指數)得到的。
在MYSQL中,對于浮點列類型,單精度(FlOAT)使用4個位元組,雙精度值(DOUBLE)使用8個位元組。浮點數可以比整型、定點數表示更大的數值範圍。
為了保證最大可能的移植性,對于使用近似數值存儲的代碼,應使用FLOAT或DOUBLE來表示,不規定精度或位數。由于浮點數存在誤差問題,如果用到浮點數,
要特别注意誤差問題,并盡量避免做浮點數比較。
MYSQL允許使用非标準文法:FLAOT(M,D)或者DOUBLE(M,D).這裡,“(M,D)”表示該值一共顯示了M位整數,其中D位整數位于小數點後面。例如,定義為FLOAT(7,4)
-999.9999。MYSQL儲存值時會進行四舍五入,是以如果在FLOAT(7,4)列内插入999.000009,近似結果是999.0001。
浮點型(FLOAT/DOUBLE)對比定點類型(DECIMAL)使用的空間更少,是以為了減少存儲空間,應盡量不要使用DECIMAL,除非是在儲存确切精度的值時候,比如錢相關的。
(4)日期/時間類型
表示時間值的日期和時間類型有DATETIME、DATE、TIMESTAMP、TIME、和YEAR。每個事件類型都有一個有效的值範圍,TIMESTAMP類型有其特有的自動更新的功能。
如果試圖插入一個不合法的日期,MYSQL将給出警告或錯誤。如果沒有使用NO_ZERO_DATE的SQL模式,預設情況下,MYSQL隻允許在DATE或DATETIME列儲存月和日是零的日期。這在應用程式中需要儲存一個你不知道的确切日期的生日時非常有用,在這種情況下,隻需要将日期儲存為'1999-00-00'
如果不使用NO_ZERO_DATE SQL 模式,MYSQL還允許将 0000-00-00儲存為僞日期。這在某些情況下比使用NULL值更友善,并且資料和索引占用的空間更小。
MYSQL以标準輸出格式檢索給定日期或時間類型的值,但它會盡力解釋你指定的各種輸值格式。盡管MSYQL在嘗試幾種格式的值時候,日期總是以“年-月-日”的順序(例如:98-09-08)來處理的,而不是以 “月-日- 年” 或 “日- 月- 年”的順序(例如: “09-04-98”、“04-09-08”)。
包含兩位年值的日期會讓人摸不着頭腦,因為不知道世紀。MSYQL使用以下規則解釋兩位年值的日期。
70-99範圍的年值均轉化為1970-1999
00-69 範圍的年值 均轉換為 2000- 2069
是以說一般資料庫定義的時候盡量的按照嚴格的資料類處理,否則後續可能出現莫名其妙的麻煩。
(1)DATETIME 、DATE、TIMESTAMP類型。
當需要同時包含日期和時間資訊的值的時候,建議用DATETIME(日期時間組合)類型。MSYQL以'YYYY-MM-DD HH:MM:SS' 的格式檢索和顯示DATETIME的值,但是允許使用字元串或數字為DATETIME列配置設定值。支援的範圍為“1000-01-01 00:00:00”到“9999-12-3123:59:59”。DATETIME類型占8個位元組。
當隻需要日期值而不需要時間部分時,建議使用DATE(日期)類型。
MYSQL使用'YYYY-MM-DD'格式檢索和顯示DATE值,但是允許使用字元串或數字為DATE列配置設定值。支援的範圍是'1000-01-01'到'9999-12-31'.DATE類型占3個位元組。
TIMESTAMP(時間戳)列用于在進行INSERT或者UPDATE操作時候記錄日期和時間。TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19個字元,并且格式為'YYYY-MM-DD HH:MM:SS'。TIMESTAMP的範圍從'1970-01-01 00:00:01' UTC 到'2038-01-0903:14-07'UTC。TIMESTAMP類型占4個位元組。
TIMESTAMP的值以UTC格式進行儲存的,存儲的時候會對目前的時區進行轉換,檢索時候再轉換會目前時區。目前時區對應的是time_zong系統變量。
控制TIMESTAMP列的初始化和更新的規則如下。
如果将TIMESTAMP類型字段定義為default current_timestamp ,那麼插入一條記錄的時候,該TIMESTAMP字段自動被指派為目前時間。
可以将這些類型聯合使用,如default current_timestam on update current_timestamp.
可以給TIMESTAMP字段指定一個預設值,也可以在SQL語句中指定TIMESTAMP字段的值。
可以使用任何常見格式指定DATETIME、DATE和TIMESTAMP的值。
對于'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字元串,允許 “不嚴格”文法:任何标點符号都可以用做日期部分或時間部分之間的分隔符。
(2)TIME(時間類型)
該時間類型的範圍是'-838:59:59'到 '838:59:59'。MYSQL以'HH:MM:SS'格式檢索和顯示TIME值(或者對于大的小時采用'HHH:MM:SS'格式)。注意标紅的沒有寫錯呢
。但是允許使用字元串或數字為TIME列配置設定值。TIME類型占用3個位元組。
就足夠讓我颠覆了,在我的印象裡貌似它一直是小于24的值,現在看起來一直都是錯的,Time類型不僅可以用于表示一天的時間(必須小于24小時),還可能為某個過去的時間或兩個事件的時間間隔(可以大于24小時,或者未負)
為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'。
超出TIME範圍但合法的值被裁為範圍最接近的端點。例如,'-850:00:00'和'850:00:00'被轉換為'-838:59:59'和'838:59:59'。
無效TIME值被轉換為'00:00:00'。請注意由于'00:00:00'本身是一個合法TIME值,隻從表内儲存的一個'00:00:00'值還不能說出原來的值是 '00:00:00'還是不合法的值。
從這裡找過來的 https://www.cnblogs.com/zhangjun516/archive/2013/03/14/2959489.html。就不去找官方文檔了。
(3)YEAR類型
YEAR類型占用一個位元組。
YEAR類型表示兩位或者四位格式的年。MYSQL以YYYY格式顯示YEAR值,但允許使用字元串或數字為YEAR列配置設定值。
預設是四位格式,在四位格式中,允許的值是1901-2155 和0000
在兩位格式中,如果兩位是字元串,那麼範圍為'00-99'。和'70-99'範圍的值分别被轉換為2000-2069 和1970 -1999範圍的YEAR值。
如果是兩位整數,範圍為1-99. 1-69 和70-99範圍的值被分别轉換為2001-2069 和1970 -1999範圍的YEAR值。請注意,兩位整數範圍與兩位字元串範圍稍微有所不同。因為你不能直接将零指定為數字并且解釋為2000.你必須将它指定為一個字元串'0'或者'00',或者它被解釋為0000.
4 字元串類型
字元串類型指 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
4.1 CHAR和VARCHAR類型
CHAR與VARCHAR類型相似,但是它們儲存和檢索資料的方式不同。
CHAR和VARCHR類型聲明的長度表示你想要儲存的最大字元數。例如CHAR(30)可以占用30個字元。注意,在CHAR(M)、VARCHAR(M)中聲明裡M代表的是字元數,而不是位元組數。
如果配置設定給CHAR或VARCHAR列的值超過了列的最大長度,則對值進行裁剪以使其長度适合。如果被裁剪掉的字元串不是空格,則會産生一條警告。
CHAR是固定長度的字元串,它的長度固定為建立表時候聲明的長度。長度範圍為0到255個字元。當儲存CHAR值時,在它們的右邊填充空格以達到指定的長度。當檢索到CHAR值時,尾部的空格會被删掉,這是MYSQL伺服器基本控制,和存儲引擎無關。CHAR類型時候存儲大部分值的長度都差不多的資料,例如MD5值。
VARCHR列中的值為可變長度的字元串。長度可以指定為0到65535之間的值(VARCHAR的最大有效長度由最大記錄長度和使用的字元集确定。整體最大長度是65532位元組。)相對于固定長度的字元串,它需要更少的存儲空間。在儲存VARCHAR的值時候,指儲存需要的字元數,然後用1-2個位元組來存儲值的長度,是以如果是很短的值(如僅有1個字元),那麼耗費的存儲空間比CHAR還會多一些,是以如果想存儲很短的類型,使用CHAR會更合适。VARCHAR可選的一種常見是最長記錄的長度值比平均長度的最大得多。
儲存VARCHAR的值的時候不會進行填充。當值儲存和檢索時尾部的空格仍然會保留,這一點符号标準SQL。