MySQL常用資料型別介紹

2021-07-23 19:27:26 字數 4329 閱讀 3058

本文使用的資料庫為mysql5.5,文章摘自《深入淺出mysql》,僅作個人筆記,謝謝

任何數值的不符合精度的儲存都要考慮到資料庫模式的設定。

整形資料型別:

對於整型資料,mysql 還支援在型別名稱後面的小括號內指定顯示寬度,例如 int(5)表示當數值寬度小於5 位的時候在數字前面填滿寬度,如果不顯示指定寬度則預設為int(11)。一般配合zerofill 使用,顧名思義,zerofill 就是用「0」填充的意思,也就是在數字位數不夠的空間用字元「0」填滿。

所有的整數型別都有乙個可選屬性unsigned(無符號),如果需要在字段裡面儲存非負數或者需要較大的上限值時,可以用此選項,它的取值範圍是正常值的下限取0,上限取原值的2 倍,例如,tinyint 有符號範圍是-128~+127,而無符號範圍是0~255。如果乙個列指定為zerofill,則mysql 自動為該列新增unsigned 屬性。

小數資料型別:

浮點數和定點數都可以用型別名稱後加「(m,d)」的方式來進行表示,「(m,d)」表示該值一共顯示m 位數字(整數字+小數字),其中d 位位於小數點後面,m 和d 又稱為精度和標度。

值得注意的是,浮點數後面跟「(m,d)」的用法是非標準用法,如果要用於資料庫的遷移,則最好不要這麼使用。float 和double 在不指定精度時,缺省會按照實際的精度(由實際的硬體和作業系統決定)來顯示,而decimal 在不指定精度時,預設的整數字為10,預設的小數字為0。

當插入資料的標度大於資料限制的標度時,浮點資料型別會四捨五入,然後將資料插入;定點資料型別會將資料truncate,然後插入資料,並且系統會出現乙個警告,向我們報告資料是經過truncate後插入的。

如果有精度和標度,則會自動將四捨五入後的結果插入,系統不會報錯;定點數如果不寫精度和標度,則按照預設值decimal(10,0)來進行操作,並且如果資料超越了精度和標度值,系統則會報錯。

注意:在今後關於浮點數和定點數的應用中,使用者要考慮到以下幾個原則:

 浮點數存在誤差問題;

 對貨幣等對精度敏感的資料,應該用定點數表示或儲存;

 在程式設計中,如果用到浮點數,要特別注意誤差問題,並盡量避免做浮點數比較;

 要注意浮點數中一些特殊值的處理。

bit(位)型別:

用於存放位字段值,bit(m)可以用來存放多位二進位制數,m 範圍從1~64,如果不寫則預設為1 位。對於位欄位,直接使用select 命令將不會看到結果,可以用bin()(顯示為二進位制格式)或者hex()(顯示為十六進製制格式)函式進行讀取。

日期時間型別:

如果要用來表示年月日,通常用date 來表示。

如果要用來表示年月日時分秒,通常用datetime 表示。

如果只用來表示時分秒,通常用time 來表示。

如果需要經常插入或者更新日期為當前系統時間,則通常使用timestamp 來表示。timestamp 值返回後顯示為「yyyy-mm-dd hh:mm:ss」格式的字串,顯示寬度固定為19 個字元。如果想要獲得數字值,應在timestamp 列新增+0。

如果只是表示年份,可以用year 來表示,它比date 占用更少的空間。year 有2 位或4 位格式的年。預設是4 位格式。在4 位格式中,允許的值是1901~2155 和0000。在2 位格式中,允許的值是70~69,表示從1970~2069 年。mysql 以yyyy 格式顯示year值。

系統給mysql表中第乙個timestamp欄位自動建立預設值current_timestamp(系統日期)。注意,mysql只給表中的第乙個timestamp欄位設定預設值為系統日期,如果有第二個timestamp型別,則預設值設定為0值。可以將預設的0值修改為其他的常量日期,但是不能再修改為current_timestmap,因為mysql規定timestamp型別字段只能有一列的預設值為current_timestmap,如果強制修改,系統會報錯誤提示,提示**1293。

timestamp還有乙個重要特點,就是和時區相關。當插入日期時,會先轉換為本地時區後存放;而從資料庫裡面取出時,也同樣需要將日期轉換為本地時區後顯示。timestamp的屬性受mysql版本和伺服器sqlmode的影響很大。

char和varchar:

myisam 儲存引擎:建議使用固定長度的資料列代替可變長度的資料列。

memory 儲存引擎:目前都使用固定長度的資料行儲存,因此無論使用char 或varchar 列都沒有關係。兩者都是作為char 型別處理。

innodb 儲存引擎:建議使用varchar 型別。對於innodb 資料表,內部的行儲存格式沒有區分固定長度和可變長度列(所有資料行都使用指向資料列值的頭指標),因此在本質上,使用固定長度的char 列不一定比使用可變長度varchar 列效能要好。因而,主要的效能因素是資料行使用的儲存總量。由於char 平均占用的空間多於varchar,因此使用varchar 來最小化需要處理的資料行的儲存總量和磁碟i/o 是比較好的。

char 和varchar 很類似,都用來儲存mysql 中較短的字串。二者的主要區別在於儲存方式的不同:char 列的長度固定為建立表時宣告的長度,長度可以為從0~255 的任何值;而varchar 列中的值為可變長字串,長度可以指定為0~255(5.0.3 以前)或者65535(5.0.3以後)之間的值。在檢索的時候,char 列刪除了尾部的空格,而varchar 則保留這些空格。

enum 型別和set 型別:

enum 中文名稱叫列舉型別,它的值範圍需要在建立表時通過列舉方式顯式指定,對1~255 個成員的列舉需要1 個位元組儲存;對於255~65535 個成員,需要2 個位元組儲存。最多允許有65535 個成員。enum 型別是忽略大小寫的,對於插入不在enum 指定範圍內的值時,並沒有返回警告,而是插入了enum的第一值,這點使用者在使用時要特別注意。另外,enum 型別只允許從值集合中選取單個值,而不能一次取多個值。

set 和enum 型別非常類似,也是乙個字串物件,裡面可以包含0~64 個成員。根據成員的不同,儲存上也有所不同。

 1~8 成員的集合,佔1 個位元組。

 9~16 成員的集合,佔2 個位元組。

 17~24 成員的集合,佔3 個位元組。

 25~32 成員的集合,佔4 個位元組。

 33~64 成員的集合,佔8 個位元組。

set 和enum 除了儲存之外,最主要的區別在於set 型別一次可以選取多個成員,而enum則只能選乙個。

set 型別可以從允許值集合中選擇任意1 個或多個元素進行組合,所以對於輸入的值只要是在允許值的組合範圍內,都可以正確地注入到set 型別的列中。對於超出允許值範圍的值將不允許注入到上面例子中設定的set 型別列中,而對於包含重複成員的集合將只取一次,這一點請注意。

text型別和blog型別

二者之間的主要差別是blob 能用來儲存二進位制資料,比如**;而text 只能儲存字元資料,比如一篇文章或者日記。text 和blob 中有分別包括text、mediumtext、longtext 和blob、mediumblob、longblob3 種不同的型別。

blob 和text 值會引起一些效能問題,特別是在執行了大量的刪除操作時。刪除操作會在資料表中留下很大的「空洞」,以後填入這些「空洞」的記錄在插入的效能上會有影響。為了提高效能,建議定期使用optimize table 功能對這類表進行碎片整理,避免因為「空洞」導致效能問題。

可以使用合成的(synthetic)索引來提高大文字字段(blob 或text)的查詢效能。簡單來說,合成索引就是根據大文字欄位的內容建立乙個雜湊值,並把這個值儲存在單獨的資料列中,接下來就可以通過檢索雜湊值找到資料行了。但是,要注意這種技術只能用於精確匹配的查詢(雜湊值對於類似《或》=等範圍搜尋操作符是沒有用處的)。可以使用md5()函式生成雜湊值,也可以使用sha1()或crc32(),或者使用自己的應用程式邏輯來計算雜湊值。請記住數值型雜湊值可以很高效率地儲存。同樣,如果雜湊演算法生成的字串帶有尾部空格,就不要把它們儲存在char 或varchar 列中,它們會受到尾部空格去除的影響。合成的雜湊索引對於那些blob 或text 資料列特別有用。用雜湊識別符號值查詢的速度比搜尋blob 列本身的速度快很多。

如果需要對blob 或者clob 字段進行模糊查詢,mysql 提供了字首索引,也就是只為字段的前n 列建立索引。

在不必要的時候避免檢索大型的blob 或text 值。例如,select * 查詢就不是很好的想法,除非能夠確定作為約束條件的where 子句只會找到所需要的資料行。否則,很可能毫無目的地在網路上傳輸大量的值。這也是blob 或text識別符號資訊儲存在合成的索引列中對使用者有所幫助的例子。使用者可以搜尋索引列,決定需要的哪些資料行,然後從符合條件的資料行中檢索blob 或text 值。

把blob 或text 列分離到單獨的表中。在某些環境中,如果把這些資料列移動到第二張資料表中,可以把原資料表中的資料列轉換為固定長度的資料行格式,那麼它就是有意義的。這會減少主表中的碎片,可以得到固定長度資料行的效能優勢。它還可以使主資料表在執行select * 查詢的時候不會通過網路傳輸大量的blob 或text 值。

MySQL常用的資料型別介紹

mysql常用的資料型別介紹 大類小類 占用位元組 說明 整型數 tinyint 1 smallint 2 mediumint 3 int4 bigint 8 字元型char 1 預設是1個位元組,如果要用多個,用括號註明如char 10 表示使用10個位元組。varchar 不定 必須用括號來註明...

mysql資料型別介紹

其中的長度以位元組為單位 名稱長度 用法tinyint m bit,bool,boolean 1如果為無符號數,可以儲存從0到255的數 否則可以儲存從 128到127的數。smallint m 2如果為無符號數,可以儲存從0到65535的數 否則可以儲存從 32768到32767的數。medium...

Mysql資料型別介紹

資料型別 事例數值資料型別 tinyint smallint mediumint int bigint float 浮點小數資料型別 double 浮點小數資料型別 decimal 定點小數型別 日期 時間資料型別 year time date datetime timestamp 字串型別 cha...