
???? 使用 MySQL 這麼長時間了,經常使用的情況時,除了自增主鍵和日期時間之外 ,能 Varchar 的基本上都給 Varchar 了。團隊内部還出現過 VARCHAR(2)、VARCHAT(4)、…、VARCHAT(2^N) 的情況,現在看來确實有點搞笑。
資料類型
數值類型
整數:tinyint、smallint、mediumint、int、bigint
小數:float、double、real、decimal
日期和時間類型:date、time、datetime、timestamp、year
字元串類型
字元串:char、varchat
大文本:tinytext、text、mediumtext、longtext
其他:enum、set
二進制類型:tinyblob、blob、mediumblob、longblob
空間資料類型:geometry、geometrycollection、point、linestring
JSON 資料類型
DECIMAL 範圍
這裡我複制一下官方文檔的解釋:
The declaration syntax for a DECIMAL column is DECIMAL(M,D). The ranges of values for the arguments are as follows: M is the maximum number of digits (the precision). It has a range of 1 to 65. D is the number of digits to the right of the decimal point (the scale). It has a range of 0 to 30 and must be no larger than M. If D is omitted, the default is 0. If M is omitted, the default is 10.
高精度的資料類型,常用來存儲交易相關的資料
decimal(M, D) 解釋:M 代表總精度(小數點前後數字總個數),D 代表刻度(小數點後的位數)。比如:decimal(5, 2) 表示存儲範圍為 -999.99~999.99
decimal(M, D) 範圍:1<= M <= 65、0 <= D <= 30
如果省略 D,預設值是 0。如果省略 M,預設值是 10
存儲空間變長(M+2 bytes)
包含兩位數年份值的日期是模糊的,因為世紀是未知的。MySQL 使用這些規則解釋兩位數的年值:
00~69 範圍内的年份值被轉換為 2000~2069
70~99 範圍内的年份值被轉換為 1970~1999
關于 char(M)、varchar(M) 和 text 的問題:
char(M) 和 varchar(M) 中 M 代表 字元個數,并不是位元組個數。當使用 UTF-8 時意味着可以插入 M 個字元,但實際會占用 M*3 個位元組
char(M) 不管實際值都會占用 M 個字元的空間,頁 varchar(M) 隻會占用實際字元應該占用的空間 +1,并且實際空間為 +1 <= M
超過 char(M) 和 varchar(M) 的 M 設定後,字元串會被截斷
char 的上限為 255 字元,varchar 和 text 的上限 65535 字元
char 在存儲的時候會截斷尾部的空格,varchar 和 text 不會
varchar 會使用 1~3 個位元組來存儲長度,而 text 不會
如上所述:
char 存定長,速度快,存在空間浪費的可能,會處理尾部空格,上限 255
varchar 存變長,速度慢,不存在空間浪費,不處理尾部空格,上限 65535,但是有存儲長度實際 65532 最大可用
text,存變長大資料,速度慢,不存在空間浪費,不處理尾部空格,上限 65535,會用額外空間存放資料長度,是以可以全部使用 65535