1. 程式人生 > >MySQL中的資料型別 [數值型、字串型、時間日期型]

MySQL中的資料型別 [數值型、字串型、時間日期型]

MySQL中的資料型別 [數值型、字串型、時間日期型] MySQL中各資料型別 1. 數值型別(整型)
型別 資料大小 型別 (無符號:unsigned) 資料大小 儲存空間
tinyint -128 到 127 
tinyint unsigned
0 到 255 
1
smallint
-32768 到 32767 smallint unsigned
0 到 65535  2
mediumint
-8388608 到 8388607
mediumint  unsigned
0 到 16777215
3
int 或 integer
-2147483648 到 2147483647 int unsigned 或 integer unsigned 0 到 4294967295
4
bigint
-9223372036854775808 到 9223372036854775807 bigint unsigned
0 到 18446744073709551615  8
2. 時間和日期型別
型別 “ 零 ” 值 儲存空間
time '00:00:00' 3
date '0000-00-00' 3
datetime '0000-00-00 00:00:00'
8
year 0000
1
timestamp 0000000000000000 4
3. 字串型別 char與varchar的區別: char:固定長度字串。長度可以指定為從0到255的任何值。當儲存char值時,在它們的右邊填充空格以達到指定的長度。當檢索到char值時,尾部的空格被刪除掉。 varchar:可變長度字串。長度可以指定為0到65,535之間的值。另外varchar需要用額外的1-2個位元組儲存字串長度 。當檢索到varchar值時,尾部的空格仍然保留。因此,VARCHAR列的有效最大長度為65,532字元。
  • varchar(M):1. 當字串長度M小於255時,用額外的1個位元組來記錄長度,儲存空間L+1。[L為值的長度]
                              2. 當字串長度M大於255時,用額外的2個位元組來記錄長度,儲存空間L+2。[L為值的長度]        char(M):儲存空間 = 指定的長度 (0 <= M <= 255)
  • 比如:char(255)和varchar(255),在儲存字串"hello world"時:
       char會用255個位元組的空間放那個11個字元;
       varchar就不會用255個,它先計算字串長度為11,然後再加上一個記錄字串長度的位元組,一共用12個位元組儲存,這樣varchar在儲存不確定長度的字串時會大大減少儲存空間。
  • 從效率上考慮,固定長度,儲存空間一次性分配,CHAR更好(長度較短的欄位:門牌號等、固定長度的欄位:性別、身份證號、手機號等)。
  • 從空間上考慮,可變長度,根據長度動態調整儲存空間,VARCHAR更好。
  • 下面的表顯示了將各種字串值儲存到CHAR(4)和VARCHAR(4)列後的結果,說明了CHAR和VARCHAR之間的差別:
char(4) 儲存空間 btyes varchar(4) 儲存空間 btyes
'' '    ' 4 '' 1
'ab' 'ab  ' 4 'ab ' 3
'abcd' 'abcd' 4 'abcd' 5
'abcdefgh' 'abcd' 4 'abcd' 5
另外: 1. varchar(n):為n個位元組的可變長度,且非Unicode的字元資料。n的值必須介於1與8,000之間的數值。儲存大小是輸入資料的位元組的實際長度 2. nvarchar(n):為n個字元的可變長度,且Unicode字元資料。n的值必須介於1與4,000之間的數值。儲存大小是所輸入字元個數的兩倍。所輸入的資料字元長度可以為零。 4. 數值型別的儲存空間
型別 儲存空間
tinyint 1
smallint 2
mediumint 3
int,integer 4
bigint 8
float(p) 如果0 <= p <= 24為4個位元組,
如果25 <= p <= 53為8個位元組
double 8
decimal(M,D),numeric(M,D) 變長
bit(M) 大約(M+7)/8個位元組
decimal和numeric型別在MySQL中視為相同的型別。它們用於儲存必須為確切精度的值,並且要指定標度和精度,例如貨幣資料。
  • 實際上小數數值只有兩種資料型別:float 和 decimal,分別是近似數值和精確數值。
  • 其他小數型別,都可以使用float和decimal來替代,例如,雙精度(double precision)資料型別等價於 float(53),real等價於float(24)。
  • numeric是 decimal的同義詞,應該避免在程式中直接使用 double precision、real和numeric,而是用 float(24) 、float(53)和decimal 代替。
5. 字串型別的儲存空間 [L為值的長度]
型別 儲存空間 (位元組)
char(M) M,0 <= M <= 255
varchar(M) L+1 或 L+2,其中L <= M 且0 <= M <= 65532
binary(M) M,0 <= M <= 255
varbinary(M) L+1個位元組,其中L <= M 且0 <= M <= 255
tinyblob
tinytext
L+1個位元組,其中L < 28
blob,text L+2個位元組,其中L < 216
mediumblob
mediumtext
L+3個位元組,其中L < 224
longblob
longtext
L+4個位元組,其中L < 232
enum('value1','value2',...) 1或2個位元組,取決於列舉值的個數(最多65,535個值)
set('value1','value2',...) 1、2、3、4或者8個位元組,取決於set成員的數目(最多64個成員)
VARCHAR、BLOB和TEXT類是變長型別。每個型別的儲存需求取決於列值的實際長度(用前面的表中的L表示)。 varbinary、binary、char、varchar異同: 1. binary 與 varbinary 型別和char與varchar型別是相似的,只是他們儲存的是二進位制資料,也就是說他們是包含位元組流而不是字元流,他們有二進位制字元的集合和順序,他們的對比,排序是基於位元組的數值進行的。 binary與varbinary的最大長度和char與varchar是一樣的,只不過他們是定義位元組長度,而char和varchar對應的是字元長度。 2. 儲存和取出時對尾部空格的處理:   char(N)用來儲存非二進位制字串,插入時,對於少於N個字元的會自動在尾部加空格,查詢時,尾部的空格就會被丟棄掉
  vachar(N) 用來儲存非二進位制字串,插入時,對於少於N個字元的不填補空格,查詢時,尾部的空格不會被丟棄掉
  binary(N)儲存二進位制字串,插入進,少於N個位元組的會自動在尾部加0x00,取出時,所有的位元組都保留,返回定義長度的位元組長度,在比較的時候,所有的位元組都是有效的,並且0x00<space (space對應的是0x20)
  varbinary在插入不會去填補0x00位元組,查詢的時候也不會丟棄任何位元組,在比較的時候,所有的位元組都是有效的,並且0x00<space (space對應的是0x20) 3.
大小比較時:   char與varchar的字元比較中,是忽略大小寫與最後的空格的。        binary及varbinary的位元組比較中,所有的資訊都不會被忽略。
  參考文件: MySql中char、varchar和nvarchar的區別:https://www.cnblogs.com/zeroingToOne/p/9568687.html
MySql資料型別的取值範圍:https://www.csdn.net/gather_25/MtTaIgzsMDg3MC1ibG9n.html
MySql中bigint、int、mediumint、smallint 和 tinyint的取值範圍:https://blog.csdn.net/iteye_7932/article/details/82399758 資料庫中char, nchar,varchar, nvarchar的差異:https://jingyan.baidu.com/article/c85b7a645639ac003bac959a.html
SQL Server 小數型別(float 和 decimal):https://www.cnblogs.com/ljhdo/p/4910699.html mysql中varbinary、binary、char、varchar異同:https://www.cnblogs.com/zejin2008/p/6606120.html                              

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

      &nbs