1. 程式人生 > >MySQL常見資料型別詳解

MySQL常見資料型別詳解

資料型別是定義列中可以儲存什麼資料以及該資料實際怎麼儲存的基本規則。
在MySQL中有如下幾種資料型別:

數值型別

MySQL的數值資料型別可以大致劃分為兩個類別,一個是整數,另一個是浮點數或小數。許多不同的子型別對這些類別中的每一個都是可用的,每個子型別支援不同大小的資料,並且MySQL允許我們指定數值欄位中的值是否有正負之分或者用零填補。

整形

整形包括:

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT
  • BIGINT

表列出了整形數值型別以及它們的允許範圍和佔用的記憶體空間。
這裡寫圖片描述
在MySQL中支援的5個主要整數型別是TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。這些型別在很大程度上是相同的,只有它們儲存的值的大小是不相同的。
MySQL以一個可選的顯示寬度指示器的形式對SQL標準進行擴充套件,這樣當從資料庫檢索一個值時,可以把這個值加長到指定的長度。定義的基本形式如下:

整型型別(顯示寬度)

對於其正確的理解,其實是顯示寬度,因為整型的顯示寬度,對數值大小無影響,只是當設定了zerofill的時候,在顯示的時候補0而已。
例如,指定一個欄位的型別為INT(8) ZEROFILL,就可以保證所包含數字少於8個的值從資料庫中檢索出來時會在前面自動補0。如下圖所示:
這裡寫圖片描述
寬度可以不設定,因為整型資料型別都有預設的顯示寬度,不設就採用預設的。
需要注意的是:

  • 使用一個寬度指示器不會影響欄位的大小和它可以儲存的值的範圍。
  • 使用ZEROFILL這個修飾符還可以阻止MySQL資料庫儲存負值。

萬一我們需要對一個欄位儲存一個超出許可範圍的數字,MySQL會根據允許範圍最接近它的一端截短後再進行儲存。還有一個比較特別的地方是,MySQL會在不合規定的值插入表前自動修改為0。
UNSIGNED修飾符規定欄位只儲存正值。因為不需要儲存數字的正、負符號,可以在儲存時節約一個“位”的空間,從而增大這個欄位可以儲存的值的範圍。

浮點型

MySQL支援的二個浮點型:

  • float[(M, D)]
  • double[(M, D)]

float數值型別用於表示單精度浮點數值,而double數值型別用於表示雙精度浮點數值。

對M和D分析

  • 浮點型別中的M和整型的大不相同
  • 整型中的M與所存資料的大小沒有關係,只在有ZEROFILL修飾符時,控制顯示填充零的位數有關。
  • 浮點型別中的M與所存資料的大小有必然關係,假如申請型別為float(6,2):其中,6代表浮點型別數不包括小數點在內為6位,其中2代表小數位,因此該列能存入-9999.99到+9999.99範圍的數。
  • 如果float(6,2) 帶有標示符unsigned,則此資料型別的儲存範圍為:0.00到+9999.99。
  • 對於小數點後面的位數超過允許範圍的值,MySQL會自動將它四捨五入為最接近它的值,再插入它,但decimal會警告資訊。
    這裡寫圖片描述
  • 當不指定精度時,float、double預設會儲存實際精度,而decimal預設是整數。
    這裡寫圖片描述

定點型

MySQL支援的定點型為:

  • decimal(M,D)

decimal資料型別用於精度要求非常高的計算中,這種型別允許指定數值的精度和計數方法作為選擇引數。精度在這裡指為這個值儲存的有效數字的總個數,而計數方法表示小數點後數字的位數。比如語句decimal(7,3) 規定了儲存的值不會超過7位數字,並且小數點後不超過3位。
例,
這裡寫圖片描述
由此看出,decimal型別更精確。
注意:

  • 忽略decimal資料型別的精度和計數方法修飾符將會使MySQL資料庫把所有標識為這個資料型別的欄位精度設定為10,計算方法設定為0。
  • UNSIGNED和ZEROFILL修飾符也可以被FLOAT、DOUBLE和 DECIMAL資料型別使用,並且效果與整型資料型別相同。

MySQL中可以指定浮點數和定點數的精度,其基本形式為:

資料型別(M,D)
  • M:精度,資料的總長度
  • D:標度,小數點後的長度

字串型別

字串型別指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。可以儲存的範圍從簡單的一個字元到巨大的文字塊或二進位制字串資料。
這裡寫圖片描述

CHAR與VARCHAR

其定義方式為:

字串型別(M)

char型別用於定長字串,並且必須在圓括號內用一個大小修飾符來定義。這個大小修飾符的範圍從0-255,比指定長度大的值將被截短,而比指定長度小的值將會用空格補於其後,查詢之時再將空格去掉。所以char型別儲存的字串末尾不能有空格,varchar不限於此。
char型別的一個變體是varchar型別,它是一種可變長度的字串型別,並且也必須帶有一個範圍在0-255之間的指示器。char和varchar不同之處在於MySQL資料庫處理這個指示器的方式:

  • char把這個大小視為值的大小,不長度不足的情況下就用空格補足。
  • varchar型別把它視為最大值並且只使用儲存字串實際需要的長度(增加一個或二個額外位元組來儲存字串本身的長度)來儲存值。所以短於指示器長度的varchar型別不會被空格填補,但長於指示器的值仍然會被截短。

因為varchar型別可以根據實際內容動態改變儲存值的長度,所以在不能確定欄位需要多少字元時使用varchar型別可以大大地節約磁碟空間、提高儲存效率,但char型別的字串檢索速度要比varchar型別的快。

TEXT

text分為4種,如下:
這裡寫圖片描述
text最大64M的位元組數,若是換算成中文字元的話,還跟字元型別有關係,比如UTF-8,一箇中文為3個位元組,那麼字元個數就是(64/3)M個數中文字元。
注意:

  • text不能用一個大小修飾符來定義,text是實際字元數+2個位元組。
  • text型別不能有預設值,寫了預設值也不起作用。
  • varchar可直接建立索引,text建立索引要指定前多少個字元。varchar查詢速度快於text,在都建立索引的情況下,text的索引似乎不起作用。

二進位制型別

二進位制型別是在資料庫中儲存二進位制資料的資料型別。二進位制型別包括BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。
這裡寫圖片描述

BINARY和VARBINARY

兩者唯一的差別在於BINARY當長度不夠時會補\0

BIT型別

其定義方式為:

BIT(M)

其中M指定了該二進位制的最大位元組長度為M,M的最大值為64。如BIT(4)就是資料型別為BIT型別,長度為4,其能夠儲存的值為0-15。因為變成二進位制後,15的值為1111。
在查詢BIT型別的資料時,要用BIN(欄位名+0)來將值轉換為二進位制顯示。
這裡寫圖片描述
上面的結果以二進位制顯示,最大的長度為4。

BLOB型別

BLOB型別是一種特殊的二進位制型別。BLOB可以儲存資料量很大的二進位制資料,如圖片,視訊等。BLOB型別包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它們之間的區別也只是最大長度不同而已。

TEXT和BLOB的區別

  • BLOB和TEXT儲存方式不同,TEXT以文字方式儲存,英文儲存區分大小寫,而BLOB是以二進位制方式儲存,不分大小寫。
  • BLOB儲存的資料只能整體讀出。
  • TEXT可以指定字符集,BLOB不用指定字符集。

日期和時間型別

在處理日期和時間型別的值時,MySQL帶有5個不同的資料型別可供選擇。它們可以被分成簡單的日期、時間型別,和混合日期、時間型別。根據要求的精度,子型別在每個分型別中都可以使用,並且MySQL帶有內建功能可以把多樣化的輸入格式變為一個標準格式。
這裡寫圖片描述
TimeStamp型別與DateTime在無輸入的情況下要注意下:

  • TimeStamp使用Current_TimeStamp()而DateTime使用NOW(來獲取當前時間)
  • 輸入NULL時,系統會輸入系統當前日期與時間
  • 無任何輸入時,系統會輸入系統當前日期與時間

在開發中,很少用日期時間型別來表示一個需要精確到秒的列。原因:雖然日期時間型別能精確到秒,而且方便檢視,但不易於計算機計算,所以用時間戳來表示。
時間戳:用int來儲存,是1970-01-01 00:00:00到當前的秒數。一般存註冊時間,商品釋出時間等,並不是用datetime儲存,而是用時間戳。因為datetime雖然直觀,但計算不便,而用int型儲存時間戳,方便計算,對於顯示來說,也可以方便格式化。

資料型別的選擇

  • 整型:根據要顯示的最大值決定。
  • 浮點型:要顯示小數,如果要精確到小數點後10位,就選擇DOUBLE,而不應該選擇FLOAT。DECIMAL精度較高,浮點數會出現誤差,如果精度較高,則應選擇定點數DECIMAL。
  • 字串型:定長與變長的區別,CHAR型別佔用空間比較大,但是處理速度比VARCHAR快,如果長度變化不大,如身份證號碼那種,最好選擇CHAR型別,而對於評論字串,最好選擇VARCHAR。
  • 時間:根據需要顯示的型別咯,特別是TIMESTAMP,如果需要顯示的時間與時區對應,就應該選擇TIMESTAMP。
  • TEXT型別和BLOB型別:TEXT只能儲存字元資料,而BLOB可以儲存二進位制資料。如果是純文字,適合TEXT,如果是圖片等適合存二進位制。

問題總結

儲存路徑的問題

MySQL中,如果路徑中使用”\”符號時,這個符號會被過濾。解決的辦法是路徑中用”/”或”\”來代替”\”,這樣MySQL就不會自動過濾路徑中的分隔符。

MySQL中的布林型別

MySQL中沒有Bool或Boolean型別,但是為了支援SQL標準,也可以定義Bool或Boolean型別的,但是Bool或Boolean型別最後轉換成的是TinyInt(1),也就是說在MySQL中,布林型別實際上是TinyInt(1)。

MySQL中如何儲存JPG圖片或MP3音樂

一般情況下,資料庫中不直接儲存圖片和音訊檔案,而是儲存圖片或音訊檔案的路徑,如果在特殊情況下需要在MySQL資料庫中儲存圖片和音訊檔案,可以選擇BLOB型別。

最後,吐露一下心聲,寫這篇文章真是操碎了心,並參考了一些文章,參考文章有: