tft每日頭條

 > 科技

 > mysql中提供了哪幾種數據類型

mysql中提供了哪幾種數據類型

科技 更新时间:2024-08-28 09:21:02
MySQL的數據類型

常用的數據類型有:

  • 整型(xxxint)
  • 位類型(bit)
  • 浮點型(float和double、real)
  • 定點數(DECIMAL,numeric)
  • 日期時間類型(date,time,datetime,year)
  • 字符串(char,varchar,xxxTEXT)
  • 二進制數據(xxxBlob、xxbinary)
  • 枚舉(ENUM)
  • 集合(set)

1、整數(xxxint)

mysql中提供了哪幾種數據類型(MySQL的10種常用數據類型)1

整數列的可選屬性有三個:

  • M: 寬度(在0填充的時候才有意義,否則不需要指定)
  • unsigned: 無符号類型(非負)
  • zerofill: 0填充,(如果某列是zerofill,那麼默認就是無符号),如果指定了zerofill隻是表示不夠M位時,用0在左邊填充,如果超過M位,隻要不超過數據存儲範圍即可

原來,在 int(M) 中,M 的值跟 int(M) 所占多少存儲空間并無任何關系。 int(3)、int(4)、int(8) 在磁盤上都是占用 4 bytes 的存儲空間。

2、浮點型

對于浮點列類型,在MySQL中單精度值使用4個字節,雙精度值使用8個字節

MySQL允許使用非标準語法(其他數據庫未必支持,因此如果設計到數據遷移,則最好不要這麼用):float(M,D)或DOUBLE(M,D)。這裡,(M,D)表示該值一共顯示M位,其中D表示小數點後幾位,M和D又稱為精度和标度。例如,定義為FLOAT(5,2)的一個列可以顯示為-999.99-999.99。M取值範圍為0~255。D取值範圍為0~30,同時必須<=M。

如果存儲時,整數部分超出了範圍(如上面的例子中,添加數值為1000.01),MySQL就會報錯,不允許存這樣的值。如果存儲時,小數點部分若超出範圍,就分以下情況:若四舍五入後,整數部分沒有超出範圍,則隻警告,但能成功操作并四舍五入删除多餘的小數位後保存,例如在FLOAT(5,2)列内插入999.009,近似結果是999.01。若四舍五入後,整數部分超出範圍,則MySql報錯,并拒絕處理。如999.995和-999.995都會報錯。

說明:小數類型,也可以加unsigned,但是不會改變數據範圍,例如:float(3,2) unsigned仍然隻能表示0-9.99的範圍。

float和double在不指定精度時,默認會按照實際的精度(由實際的硬件和操作系統決定)來顯示

REAL就是DOUBLE ,如果SQL服務器模式包括REAL_AS_FLOAT選項,REAL是FLOAT的同義詞而不是DOUBLE的同義詞。

注意:在編程中,如果用到浮點數,要特别注意誤差問題,因為浮點數是不準确的,所以我們要避免使用“=”來判斷兩個數是否相等。如果希望保證值比較準确,推薦使用定點數據類型。

3、位類型(了解)

BIT數據類型可用來保存位字段值。BIT(M)類型允許存儲M位值。M範圍為1~64,默認為1。

BIT其實就是存入二進制的值,類似010110。如果存入一個BIT類型的值,位數少于M值,則左補0。如果存入一個BIT類型的值,位數多于M值,MySQL的操作取決于此時有效的SQL模式:如果模式未設置,MySQL将值裁剪到範圍的相應端點,并保存裁減好的值。如果模式設置為traditional(“嚴格模式”),超出範圍的值将被拒絕并提示錯誤,并且根據SQL标準插入會失敗。

對于位字段,直接使用SELECT命令将不會看到結果,可以用bin()或hex()函數進行讀取。

4、定點型

DECIMAL在MySQL内部以字符串形式存放,比浮點數更精确。定點類型占M 2個字節

DECIMAL(M,D)與浮點型一樣處理規則。M的取值範圍為0~65,D的取值範圍為0~30,而且必須<=M,超出範圍會報錯。

DECIMAL如果指定精度時,默認的整數位是10,默認的小數位為0。

NUMERIC等價于DECIMAL。

5、日期時間類型

mysql中提供了哪幾種數據類型(MySQL的10種常用數據類型)2

對于year類型,輸入的是兩位,“00-68”表示2000-2069年,“70-99”表示1970-1999年。記得比較麻煩,建議使用4位标準格式。

'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS','YYYY-MM-DD'或'YY-MM-DD'格式的字符串。允許“不嚴格”語法:任何标點符都可以用做日期部分或時間部分之間的間隔符。例如,'98-12-31 11:30:45'、'98.12.31 11 30 45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等價的。

'YYYYMMDD'或'YYMMDD'格式的沒有間割符的字符串,假定字符串對于日期類型是有意義的。例如,'19970523'和'970523'被解釋為 '1997-05-23',但'971332'是不合法的(它有一個沒有意義的月和日部分),将變為'0000-00-00'。

對于包括日期部分間隔符的字符串值,如果日和月的值小于10,不需要指定兩位數。'1979-6-9'與'1979-06-09'是相同的。同樣,對于包括時間部分間隔符的字符串值,如果時、分和秒的值小于10,不需要指定兩位數。'1979-10-30 1:2:3'與'1979-10-30 01:02:03'相同。

數字值應為6、8、12或者14位長。如果一個數值是8或14位長,則假定為YYYYMMDD或YYYYMMDDHHMMSS格式,前4位數表示年。如果數字 是6或12位長,則假定為YYMMDD或YYMMDDHHMMSS格式,前2位數表示年。其它數字被解釋為仿佛用零填充到了最近的長度。

一般存注冊時間、商品發布時間等,不建議使用datetime存儲,而是使用時間戳,因為datetime雖然直觀,但不便于計算。而且timestamp還有一個重要特點,就是和時區有關。

6、字符串型

mysql中提供了哪幾種數據類型(MySQL的10種常用數據類型)3

char,varchar,text區别

char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區别是:

char如果不指定(M)則表示長度默認是1個字符。varchar必須指定(M)。

char(M)類型的數據列裡,每個值都占用M個字符,如果某個長度小于M,MySQL就會在它的右邊用空格字符補足(在檢索操作中那些填補出來的空格字符将被去掉;如果存入時右邊本身就帶空格,檢索時也會被去掉);在varchar(M)類型的數據列裡,每個值隻占用剛好夠用的字符再加上一個到兩個用來記錄其長度的字節(即總長度為L字符 1/2字字節)。[I1]

由于某種原因char 固定長度,所以在處理速度上要比varchar快速很多,但相對費存儲空間,所以對存儲不大,但在速度上有要求的可以使用char類型,反之可以用varchar類型來實例。

text文本類型,可以存比較大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建議使用char,varchar來代替。還有text類型不用加默認值,加了也沒用。

哪些情況使用char更好

一,存儲很短的信息,比如門牌号碼101,201……這樣很短的信息應該用char,因為varchar還要占個byte用于存儲信息長度,本來打算節約存儲的現在得不償失。

二,固定長度的。比如使用uuid作為主鍵,那用char應該更合适。因為他固定長度,varchar動态根據長度的特性就消失了,而且還要占個長度信息。

三,十分頻繁改變的column。因為varchar每次存儲都要有額外的計算,得到長度等工作,如果一個非常頻繁改變的,那就要有很多的精力用于計算,而這些對于char來說是不需要的。

MyISAM和MEMORY存儲引擎中無論使用char還是varchar其實都是作為char類型處理的。

除此之外,建議使用varchar類型。特别是InnoDB存儲引擎。

7、二進制值類型(了解)

包括:xxxBLOB和xxxBINARY

BINARY和VARBINARY類型類似于CHAR和VARCHAR類型,但是不同的是,它們存儲的不是字符字符串,而是二進制串。所以它們沒有字符集,并且排序和比較基于列值字節的數值值。當保存BINARY(M)值時,在它們右邊填充0x00(零字節)值以達到指定長度。取值時不删除尾部的字節。比較時所有字節很重要(因為空格和0x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '會變成'a \0'。

BLOB是一個二進制大對象,可以容納可變數量的數據。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們隻是可容納值的最大長度不同。分别與四種TEXT類型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT對應有相同的最大長度和存儲需求。在TEXT或BLOB列的存儲或檢索過程中,不存在大小寫轉換。BLOB和TEXT列不能有默認值。BLOB或TEXT對象的最大大小由其類型确定,但在客戶端和服務器之間實際可以傳遞的最大值由可用内存數量和通信緩存區大小确定。你可以通過更改max_allowed_packet變量的值更改消息緩存區的大小,但必須同時修改服務器和客戶端程序。

8、枚舉(ENUM)

MySql中的ENUM是一個字符串對象,其值來自表創建時在列規定中顯式枚舉的一列值:

可以插入空字符串""和NULL(如果運行NULL的話)。

如果你将一個非法值插入ENUM(也就是說,允許的值列之外的字符串),如果是嚴格模式,将不能插入,如果是非嚴格模式,将選用第一個元素代替,并警告。

ENUM最多可以有65,535個成員,需要2個字節存儲。

當創建表時,ENUM成員值的尾部空格将自動被删除。

值的索引規則如下:

來自列規定的允許的值列中的值從1開始編号。

空字符串錯誤值的索引值是0。

NULL值的索引是NULL。

9、集合(SET)

SET和ENUM類型非常類似,也是一個字符串對象,裡面包含0~64個成員。

SET和ENUM存儲上有所不同,SET是根據成員的個數決定存儲的字節數。

SET和ENUM最主要的區别在于SET類型一次可以選擇多個成員,而ENUM則隻能選擇一個。

10、特殊的NULL類型

Null類型特征:

(1)所有的類型的值都可以是null,包括int、float等數據類型

(2)空字符串””,不等于null,0也不等于null,false也不等于null

(3)任何運算符,判斷符碰到NULL,都得NULL

(4)NULL的判斷隻能用is null,is not null

(5)NULL 影響查詢速度,一般避免使值為NULL

面試:

為什麼建表時,加not null default '' / default 0

答:不想讓表中出現null值.

為什麼不想要的null的值

答:(1)不好比較,null是一種類型,比較時,隻能用專門的is null 和 is not null來比較.

碰到運算符,一律返回null

(2)效率不高,影響提高索引效果.

因此,我們往往,在建表時 not null default ''/0

(4.0版本以下,varchar(20),指的是20字節,如果存放UTF8漢字時,隻能存6個(每個漢字3字節) ;5.0版本以上,varchar(20),指的是20字符)


相關閱讀:

MySQL之MYCAT讀寫分離

MySQL的配置詳解

MySQL權限與安全

MySQL的使用情況詳解

MySQL之主從複制

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved