佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > MySQL入門(二) 數(shù)據(jù)庫數(shù)據(jù)類型詳解

MySQL入門(二) 數(shù)據(jù)庫數(shù)據(jù)類型詳解

熱門標(biāo)簽:呼叫中心市場需求 網(wǎng)站排名優(yōu)化 服務(wù)外包 地方門戶網(wǎng)站 鐵路電話系統(tǒng) 百度競價排名 AI電銷 Linux服務(wù)器

序言

今天去健身了,感覺把身體練好還是不錯的,閑話不多說,把這個數(shù)據(jù)庫所遇到的數(shù)據(jù)類型今天統(tǒng)統(tǒng)在這里講清楚了,以后在看到什么數(shù)據(jù)類型,咱度應(yīng)該認(rèn)識,對我來說,最不熟悉的應(yīng)該就是時間類型這塊了。但是通過今天的學(xué)習(xí),已經(jīng)解惑了。下面就跟著我的節(jié)奏去把這個拿下吧。

  ---WH

一、數(shù)據(jù)類型

MySQL的數(shù)據(jù)類型有大概可以分為5種,分別是 整數(shù)類型、浮點數(shù)類型和定點數(shù)類型、日期和時間類型、字符串類型、二進(jìn)制類型?,F(xiàn)在可以來看看你對這5種類型的熟悉程度,哪個看起來懵逼了,那就說明自己哪個不熟悉,不理解?! ?/p>


注意:整數(shù)類型和浮點數(shù)類型可以統(tǒng)稱為數(shù)值數(shù)據(jù)類型,這不難理解。

數(shù)值數(shù)據(jù)類型

  整數(shù)類型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT

  浮點數(shù)類型:FLOAT、DOUBLE

  定點小數(shù):DECIMAL

日期/時間類型

  YEAR、TIME、DATE、DATETIME、TIMESTAMP

字符串類型

  CHAR、VARCHAR、TEXT、ENUM、SET等   

二進(jìn)制類型

  BIT、BINARY、VARBINARY、BLOB

1、整數(shù)類型

不管你學(xué)什么語言,在基礎(chǔ)方面,都應(yīng)該知道 1個字節(jié)= 8位二進(jìn)制數(shù)。 每個類型的取值范圍也就能夠知道,比如 TINYINT占用1個字節(jié),也就是8位,2的8次方減1等于255,也就是說如果代表沒符號的整數(shù),該取值范圍為0~255,如果是有符號的,最高位為符號號位,也就是2的7次方減1,也就是127,取值范圍為-128~127, 為什么需要減1,這個問題就需要考慮臨界值的問題了。而考慮臨界值問題又有需要討論原碼補(bǔ)碼反碼的知識,這些度不是我們討論的重點,所以在這就自行百度。給出一張范圍表,給大家做參考。

不同整數(shù)類型的取值范圍

根據(jù)自己所需去選取不同的類型名稱,

  例如:

CREATE TABLE aaa(
 id INT(10) PRIMARY KEY,
 age INT(6)
  );

  這個例子中INT(10)、INT(6) 括號中的數(shù)字表示的是該數(shù)據(jù)類型指定的顯示寬度,指定能夠顯示的數(shù)值中數(shù)字的個數(shù)。這里要注意:顯示寬度和數(shù)據(jù)類型的取值范圍是無關(guān)的,顯示寬度只是指明MySQL最大可能顯示的數(shù)字個數(shù),注意是可能。通俗點講就是,比如這個age字段,顯示寬度為6,但是如果你插入的數(shù)據(jù)大于6,達(dá)到了8,6666 6666,那也沒關(guān)系,只要插入的數(shù)值的位數(shù)不超過該類型整數(shù)的取值范圍,就行,如果插入的數(shù)值長度是4,或者3,數(shù)值的位數(shù)小于指定的寬度,后面的位數(shù)就會由空格填空,5555插入age字段,存的就是"5555 "后面用空格補(bǔ)齊。還有一點,這個顯示寬度沒限制,你寫100度沒問題,但是插入數(shù)據(jù)時,實際起控制作用的還是數(shù)據(jù)類型的取值范圍。如果不寫顯示寬度,就會用系統(tǒng)默認(rèn)的,比如,INT的默認(rèn)顯示寬度是11,看上面表,最高也就能表示10位大小的數(shù)值,但是要注意,有符號的,也就是負(fù)數(shù)時,符號位也占一位。

2、浮點數(shù)類型和定點數(shù)類型

  

2.1解釋M,D的意思:

M:數(shù)值的總位數(shù)。 通俗點講,就是看有多少個數(shù)字,比如,5.6789,M就是5
D:小數(shù)點后面能保留幾位。 比如上面的5.6789 ,D就是4。 這只是舉一個例子,來說明M,D是什么,實際是先有M,D的,然后在來控制數(shù)值,而不是更具數(shù)值來確定M,D。

不單單就MECIMAL有M,D這兩個參數(shù),F(xiàn)LOAT 和 DOUBLE 度有,看下面例子

比如:

   CREATE TABLE tmp(
  x FLOAT(3,1),
  y DOUBLE(5,3),
  z DECIMAL(5,4)
   );

假設(shè)x插入的值為:5.69,56.78,5.438,349.2 (注意:實驗給x這個字段插入的值,可能實驗了三次,不要錯看成x的值為5.69,y為56.78等等了)
實際上在數(shù)據(jù)庫中存的值為:5.7,56.9,5.3,349.2這個報錯
分析:x的M為3,D為1,那么小數(shù)點上必須是占了一位數(shù)字,就算沒有值,也會用0來填充,所以說,整數(shù)位上最多就只能是2位,這里要切記要先根據(jù)D的值,來算整數(shù)位能最多有多少位。

通過分析x,y和z也就簡單了,

y字段上的值,整數(shù)部分最多是2位,小數(shù)點后的位數(shù)最多是3位,也就是說小數(shù)點后超過了3位,就會四舍五入。
z字段上的值,整數(shù)部分最多只能是一位,小數(shù)點后的位數(shù)最多是4位,如果不足4位,也會用0補(bǔ)充。比如插入1.56,在數(shù)據(jù)庫中存的就是1.5600, 比如插入25.46,這個就會報錯,因為整數(shù)部分只能是一位,小數(shù)點后的位數(shù)已經(jīng)占了4位了。這里要搞清楚。

2.2、FLOAT、DOUBLE、DECIMAL三者的區(qū)別。

都是用來表示我們所說的小數(shù)的也就是浮點數(shù),但是三種的精度不一樣,也就是后面顯示的位數(shù)不一樣,

區(qū)別一:

FLOAT顯示后面的小數(shù)點位大概在40多位,

DOUBLE能顯示的就是300多位了,不是一個層次上的,

DECIMAL這個小數(shù)點后面能顯示的位數(shù)跟DOUBLE差不多,

區(qū)別二:

   FLOAT和DOUBLE在不指定精度時,也就是不用(M,D),默認(rèn)會按照實際的精度,也就是你寫多少就是多少,而DECIMAL如不指定精度默認(rèn)為(10,0),也就是如果不指定精度,插入數(shù)值56.89,在數(shù)據(jù)庫中存儲的就是57。所以一般使用DECIMAL時就會指定精度,而使用FLOAT和DOUBLE就不用。

區(qū)別三:

   浮點數(shù)相對與定點數(shù)(DECIMAL)的優(yōu)點就是在長度一定的情況下,浮點數(shù)能夠表示更大的數(shù)據(jù)范圍,但是缺點是會引起精度問題。

   2.3、什么時候使用FLOAT、DOUBLE、DECIMAL

   對精度要求比較高的時候,比如貨幣、科學(xué)數(shù)據(jù)等,使用DECIMAL的類型比較好。其他的時候,看你要存放的數(shù)據(jù)的大小而定了,一般使用DOUBLE。并且在使用浮點數(shù)時需要注意,盡量避免做浮點數(shù)的比較,比如加、減,誰大誰小,這樣的操作,會引起精度缺失。相信在一些程序語言中,遇到過float精度丟失的問題?! ?/p>

3、日期與時間類型

現(xiàn)在有些東西看不懂沒關(guān)系,大概有個了解先,接下來一一進(jìn)行講解。

3.1、YEAR 

   3.1.1、重點看他的存儲范圍,1901~2155. 在插入該數(shù)值時,有兩種方式,一種是用字符串來代表插入的YEAR值,另一種是用數(shù)字代表YEAR值,其中字符串插入的可以用單引號和雙引號,沒區(qū)別,跟一些程序設(shè)計語言不一樣,單個字符就必須用單引號,多字符就要用雙引號,在MySQL中,單雙引號度表示字符。

例子:

  CREATE TABLE tmp(
   y YEAR
   );  

向表中插入數(shù)據(jù):INSERT INTO tmp VALUES(2010),('2010'),("2010");
查詢表中數(shù)據(jù):SELECT * FROM tmp;
能查看三條記錄度插入到數(shù)據(jù)庫tmp表中了。注意:這里插入數(shù)據(jù)和查詢數(shù)據(jù)操作還沒學(xué)過,如果不知道,可以暫時跳過,直接看結(jié)論。

 

如果向表中插入超出范圍的值,2166則會報錯

3.1.2、在插入完整年份時,用字符串和用數(shù)字代表YEAR值的效果是一樣的,但是當(dāng)省略YEAR值時,用這兩種方式就不一樣了。

例子一:就拿上面那張tmp表來說。向表中插入用字符串代表的YEAR值,''0' 、'00'、 '77'、 '10'
刪除表中數(shù)據(jù):DELETE FROM tmp;
向表中插入數(shù)據(jù):INSERT INTO tmp VALUES('0'),('00'),('77'),('10');

結(jié)果:

插入的字符'0'、'00'變成了2000
插入的字符'77'變成了1977
插入的字符'10'變成了2010

例子二:

向tmp表中y字段插入2位數(shù)字表示YEAR值,0,00,78,11
刪除表中數(shù)據(jù):DELETE FROM tmp;
向表中插入數(shù)據(jù):INSERT INTO tmp VALUES(0),(00),(77),(11);

結(jié)果:

插入的數(shù)字0、00變成了0000
插入的數(shù)字77變成了1977
插入的數(shù)字11變成了2011

結(jié)論:在省略寫年份時,

1、用字符表示和用數(shù)字表示的區(qū)別就在于0。如果是字符0或字符00,則在數(shù)據(jù)庫中會生成2000,如果是數(shù)字0或00,則會生成0000.
2、在不超過70,也就是小于70,度會生成2000年以上,也就是如果是69,則生成2069.如果是70以上包含70,就會變成1970以上。比如70,就會變?yōu)?970。也就是00-69范圍的年值轉(zhuǎn)換為2000~2069. 70-99范圍的年值轉(zhuǎn)換為1970~1999
3、一般我們?nèi)绻褂?,也就用全稱,這樣不容易混淆,但是得知道有這些特性

3.2、TIME    

格式:HH:MM:SS HH表示小時 、MM表示分鐘、SS表示秒

取值范圍:-838:59:59 ~ 838:59:59

解釋:這里的時間不僅僅可以用來表示一天的時間(也就是24小時),還可能是某件事情過去的時間或兩個事件之間的時間間隔,通俗點講,我們平常每天的時間就是從凌晨0點就重新開始計時,計滿24個小時,然后又重新開始,也就相當(dāng)于當(dāng)前我們看到的時間是凌晨0點過去的時間,也就是距凌晨0點過去了多少個小時。 早上7點,也就是距離凌晨0點這件事7個小時,以此類推,直到距離了24個小時,然后重新開始計算。 在MySQL中,這個TIME就不局限于每天距離凌晨0點多長時間了,可以是過去某個時間距離現(xiàn)在多長時間了,比如昨天早上7點,距離現(xiàn)在上午9.00多長時間了,就超過了24小時,所以。這個TIME的取值范圍就比我們所理解的24小時更大。

3.2.1、表示TIME有很多種格式,上面的HH:MM:SS只是標(biāo)準(zhǔn)的一種,

  1、D HH:MM:SS :D表示日、天數(shù)。在數(shù)據(jù)庫中存儲時,D會被轉(zhuǎn)換為小時保存,D*24+HH

  2、HH:MM 、D:HH、 SS :這些格式度是可以的,注意最后一個,如果是單獨就是2個數(shù)字,那么就代表的是秒,比如"20"那就代表的是00:00:20

  3、HHMMSS: 這是沒有間隔符的字符串或者數(shù)值,比如101112會被理解為10:11:12,但是109712就是不合法的,因為分鐘位上超過了59。存儲時會報錯。這個沒有冒號時需要注意一點,數(shù)值的最右邊兩位表示秒,以此類推,比如 5523 表示的是00:55:23而不是55:23:00。 所以說上面SS格式時代表的是秒就是這樣來的,從最右邊看起。如果有冒號,則從左邊小時開始看起,比如 55:23 就是代表的55:23:00

例如:

  CREATE TABLE tmp(

t TIME

  );

  插入值"10:05:05"、"23:23"、"2 10:10"、"3 02"、"10"、"101112"、"109712"
  INSERT INTO tmp VALUES("10:05:05"),("23:23"),("2 10:10"),("3 02"),("10"),("101112");
  SELECT * FROM tmp;  

 

可以看出:都是如我們預(yù)期的那樣顯示數(shù)據(jù)?! ?/p>

3.2.2、使用系統(tǒng)的函數(shù),插入當(dāng)前的時間。

  DELETE FROM tmp;

  INSERT INTO tmp VALUES(CURRENT_TIME),(NOW());

  SELECT * FROM tmp;

3.3、DATE

格式:YYYY-MM-DD  YYYY表示年份  MM表示月份  DD表示日

取值范圍:1000-01-01~9999-12-3

  使用字符或者數(shù)值的數(shù)據(jù)度可以插入

注意:這個除了標(biāo)準(zhǔn)格式之外,跟TIME一樣YEAR一樣,在年份這里也有其省略格式,其規(guī)則和YEAR中一樣。00-69范圍的年值轉(zhuǎn)換為2000~2069. 70-99范圍的年值轉(zhuǎn)換為1970~1999。 例如:12-12-31 表示2012-12-31 981231表示1998-12-31

也可以使用CURRENT_DATE或者NOW()插入當(dāng)前的系統(tǒng)日期。

例子:(注意,每次創(chuàng)建表之前,會把之前的老表給刪除掉,這里省略掉了,使用DROP TABLE 表名; )

   CREATE TABLE tmp(
 d DATE
  ?。?

   INSERT INTO tmp VALUES("1998-08-08"),(19980808),(100511),(CURRENT_DATE),(NOW());
   SELECT * FROM tmp;

注意:MySQL允許“不嚴(yán)格”語法,也就是任何標(biāo)點符號度可以當(dāng)用日期部分之間的間隔符,比如"98.11.23"、"98/11/31"、"98@11@31"都可以,自己可以去嘗試嘗試,但是一般使用標(biāo)準(zhǔn)格式比較好,讓人看起來舒服。

3.4、DATETIME  

格式:YYYY-MM-DD HH:MM:SS

取值范圍:1000-01-01 00:00:00~9999-12-3 23:59:59

  這個不用做多解釋,因為這個就是DATE和TIME的結(jié)合體。其各種特點在這里也能夠適合。但是注意HH:MM:SS 只能表示一天的時間,也就最多到23:59:59.

例子:

   CREATE TABLE tmp(

 dt DATETIME

  ?。?

   INSERT INTO tmp VALUES("1998-08-08 08-08-08"),(980808080808),(CURRENT_DATE()),(NOW());

   SELECT * FROM tmp;

注意:MySQL允許“不嚴(yán)格”語法,也就是任何標(biāo)點符號度可以當(dāng)用日期部分之間的間隔符,比如"98.11.23"、"98/11/31"、"98@11@31"都可以,自己可以去嘗試嘗試,但是一般使用標(biāo)準(zhǔn)格式比較好,讓人看起來舒服。

3.4、DATETIME  

格式:YYYY-MM-DD HH:MM:SS

取值范圍:1000-01-01 00:00:00~9999-12-3 23:59:59

  這個不用做多解釋,因為這個就是DATE和TIME的結(jié)合體。其各種特點在這里也能夠適合。但是注意HH:MM:SS 只能表示一天的時間,也就最多到23:59:59.

例子:

   CREATE TABLE tmp(

 dt DATETIME

  ?。?

   INSERT INTO tmp VALUES("1998-08-08 08-08-08"),(980808080808),(CURRENT_DATE()),(NOW());

   SELECT * FROM tmp;

CURRENT_DATE()返回的是當(dāng)前系統(tǒng)的日期 格式 YYYY-MM-DD 所以在前面打印YEAR和DATE度可以用到該函數(shù),因為包含了其數(shù)據(jù)類型所要的信息

 NOE()返回當(dāng)前系統(tǒng)的日期和時間值,格式為YYYY-MM-DD HH:MM:SS,所以在這里能夠使用其輸出DATETIME類型的值。

   3.5、TIMESTAMP

 格式:YYYY-MM-DD HH:MM:SS

 取值范圍:1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:17 UTC

 解釋:顯示寬度固定在 19個字符。也就是這個輸出標(biāo)準(zhǔn)格式,UTC表示世界標(biāo)準(zhǔn)時間,這個跟DATETIME基本上一樣,但是有一個最大的區(qū)別,我們需要知道。

 區(qū)別:存儲字節(jié)和支持的范圍不一樣,最重要的區(qū)別在DATETIME在存儲日期數(shù)據(jù)時,按實際輸入的格式存儲,即輸入什么就存儲什么,也就輸出什么,與時區(qū)無關(guān),而TIMESTAMP值的存儲是以UTC格式保存,存儲時會對當(dāng)前時區(qū)進(jìn)行轉(zhuǎn)換,檢索時再轉(zhuǎn)換回當(dāng)前時區(qū),也就是查詢時,會根據(jù)當(dāng)前時區(qū)的不同,顯示的時間值不同。 時區(qū)的意思就是,你在美國和你在中國兩邊的時間顯示不一樣,你在美國有在美國的時間,比中國快多長時間,比如在中國才早上8點,在美國可能就是晚上8.9點了(這個只是打個比方,準(zhǔn)備轉(zhuǎn)換時間我沒去看。)

 例如:

  CREATE TABLE tmp(
    ts TIMESTAMP
  );

  INSERT INTO tmp VALUES(NOW());
  SELECT * FROM tmp;

  轉(zhuǎn)換時區(qū)

可以看到,如我們所想,輸出時間變了,增加了兩個小時,這個是關(guān)于什么東10區(qū),東8區(qū)等,我也不懂這些時差,總之能夠得出結(jié)論就行了。

也就是說,TIMESTAMP和DATETIME其實差不多,就是一個時區(qū)的差別。TIMESTAMP也叫時間戳。以后遇到它我們就應(yīng)該知道是什么東西了

4、字符串類型

有CHAR、CARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET

4.1、CHAR和VARCHAR

CHAR(M):為固定長度字符串,固定長度的意思就是M的值為多少,那么該M的值就是其實際存儲空間的值,就算插入的數(shù)據(jù)少于M位,其存儲空間還是那么大,多余的用空格補(bǔ)齊。在輸出時,空格將被刪除不輸出。M最大為255,比如char(4),如果插入abc,則存儲的值為'abc '后面多了一個空格,輸出還是‘a(chǎn)bc', 存儲空間還是占4個字節(jié)。M最大為255
VARCHAR(M):長度可變的字符串,跟CHAR相反,會根據(jù)實際的大小值來確定存儲空間的大小,比如 VARCHAR(4),插入'ab',則存儲空間為3字節(jié),看上面圖就知道VARCHAR會多一個字節(jié)用來存儲長度,M最大為65535.
注意:字符串跟數(shù)值類型不一樣,M為多大,就最多能插入多少字符,超過了M,就會報錯

例子:

CREATE TABLE tmp(
ch CHAR(4),
vch VARCHAR(4);
); 
INSERT INTO tmp VALUES('asdf','asdfg');

結(jié)果報錯:

INSERT INTO tmp VALUES('ab ','ab ');

SELECT concat( '(', ch ,')' ),concat( '(',vch,')' ) FROM tmp;//這句話的意思就用(將結(jié)果包起來,用來觀察輸出的字符長度)

  

說明,CHAR不能夠存儲空格字符,而VARCHAR可以?!       ?/p>

4.2、TEXT

    text分四種:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
      TINYTEXT:255字符
      TEXT:65535字符
      MEDIUNTEXT:16777215字符
      LONGTEXT:4294967295,大概4GB的字符

    也就是說,比如我們要存一本小說,那么就需要使用上面四種中的一種來存儲,選取MEDIUNTEXT或者LONGTEXT差不多。

4.3、ENUM

    枚舉,格式:字段名 ENUM('值1','值2','值3'...,'值n'); n最多為65535
    例如:

      CREATE TABLE tmp(
        enm ENUM('first','second','third');
     ?。?      

      解釋:enm字段的數(shù)據(jù)類型為ENUM,枚舉類型,那么在插入該字段中的值只能為枚舉中的這幾個值,不能插入別得值,否則報錯

      INSERT INTO tmp VALUES('first'),('FIRST');
      SELECT * FROM tmp;

MySQL不區(qū)分大小寫。

INSERT INTO tmp VALUES('four');

報錯:

例子二:

CREATE TABLE tmp(
  soc INT,
  level ENUM('excellent','good','bad')
);

INSERT INTO tmp VALUES(70,2),(90,1),(55,3);
SELECT * FROM tmp;

使用索引值,也可以選擇枚舉中得值,從1開始,不是0,注意這點

總結(jié):使用ENUM類型就是為了限制字段上的值的取值范圍,只能取我們所規(guī)定的值。

4.4、SET

格式:字段名 SET('值1','值2','值3','值4'...,'值n') n最大為64
通過例子來講解這個SET的特點

CREATE TABLE tmp(
  s SET('a','b','c','d');
);

INSERT INTO tmp VALUES('a'),('a,b,a'),('c,a,d');
SELECT * FROM tmp;

a 變成 a
a,b,a 變成 a,b
c,a,d 變成 a,c,d

結(jié)論:

1、插入SET字段中的值如果有重復(fù),則會自動刪除重復(fù)的值
2、插入SET字段中的值會按順序排列,排列規(guī)則就是按照SET中的值的排列優(yōu)先順序

INSERT INTO tmp VALUES('a,x,b');

報錯:

結(jié)論:

3、如果插入了不屬于SET中的值,就會報錯

SET的特性就上面所說的三點   

5、二進(jìn)制類型  

用來存放二進(jìn)制數(shù),也就是01010這種。有BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUNBLOB和LONGBLOB

   

5.1、BIT類型 

位字段類型,M表示插入值的位數(shù),最大為64位,默認(rèn)值為1,如果插入值小于M位,值的左邊用0填充,

 例子:

CREATE TABLE tmp(
b BIT(4)
);

解釋:4位的二進(jìn)制,也就是能夠保存0到15之間的值。

INSERT INTO tmp VALUES(2),(10),(15);       
SELECT BIN(b+0) FROM tmp;

解釋:我們將2,10,15這三個10進(jìn)制存入數(shù)據(jù)表中,其字段為BIT類型,所以在表中存放的是二進(jìn)制數(shù),但是將其顯示出來,要先將二進(jìn)制數(shù)轉(zhuǎn)換為對應(yīng)的數(shù)字的值,也就是通過b+0, 然后在通過BIN()函數(shù)將數(shù)字轉(zhuǎn)換為二進(jìn)制。我們可以嘗試不用BIN()函數(shù),只用b+0,看輸出什么

SELECT b+0 FROM tmp;

 

5.2、BINARY和VARBINARY類型

格式:字段 BINARY(M)或者VARBINARY(M)

這兩個跟CHAR和VARCHAR類似,

  BINARY:長度是固定的,指定長度后,不足最大程度的,將在它們右邊填充"\0"來達(dá)到指定長度,

  VARBINARY:長度是可變的,制定好長度后,其長度可以在0到最大值之間,例如,指定字段數(shù)據(jù)類型為VARBINARY(20),如果插入的值的長度只有10,則實際存儲空間為10加1,即實際占用的空間為字符串的實際長度加1.

說了這么多,但是還是不明白這兩個有什么用處,現(xiàn)在來告訴你,我們說MySQL中對大小寫不敏感,但是這兩個數(shù)據(jù)類型卻對大小寫敏感,原因是他們是用二進(jìn)制來保存數(shù)據(jù)的,比如A和a,兩個的二進(jìn)制就不一樣。所以在很多時候我們需要區(qū)分大小寫的時候,就會用到該類型。

注意:這兩個類型的長度計算的是字節(jié)長度,一個字符等于2個字節(jié),比如BINARY(4)這個表示能夠存放4個字節(jié)的長度,也就是只能存放2個漢字。可以存4個字母。不要把這個長度當(dāng)成二進(jìn)制位的長度了,說是二進(jìn)制字符串的意思是,用二進(jìn)制來進(jìn)行存儲,但是其長度約束是字節(jié)長度。

例子:

  CREATE TABLE tmp(
    b BINARY(10)
 ?。?

  INSERT INTO tmp VALUES('a');
  select * from tmp WHERE b='A';

解釋:在tmp表中存放了一個小寫a,然后通過大寫A查找表中,看是否能找到a,結(jié)果找不到,就驗證了我們上面的說法,具有區(qū)分大小寫的功能。

總結(jié):BINARY和VARBINARY的主要作用就是用來區(qū)分大小寫的,其他沒什么作用,但是使用時要注意限制其大小的是字節(jié)數(shù),而不是二進(jìn)制位,它存儲的格式是用二進(jìn)制來存儲的。這兩個不要搞混淆了。

 5.3、BLOB類型

是一個二進(jìn)制大對象,TINYBLOB(32kb)、BLOB(64kb)、MEDIUMBLOB(16M)和LONGBLOB(4GB)。一般存儲的是一些圖像,音頻文件。

二、如何選擇數(shù)據(jù)類型      

1、整數(shù)和浮點數(shù)

  如果不需要小數(shù)部分,則使用整數(shù)來保存數(shù)據(jù),并且根據(jù)整數(shù)的大小,來選擇合適的整數(shù)類型,如果需要小數(shù)部分,則使用浮點數(shù)類型,浮點數(shù)類型中,有float和double,如果需要精度高一點,則選擇double。根據(jù)自己的需求來決定選什么。

2、浮點數(shù)和定點數(shù)

  浮點數(shù)FLOAT、DOUBLE相對應(yīng)定點數(shù)DECIMAL的優(yōu)勢在于:在長度一定的情況下,浮點數(shù)能表示更大的數(shù)據(jù)范圍,但是浮點數(shù)容易產(chǎn)生誤差,因此在精度比較高時,建議使用DECIMAL,比如貨幣這一類東西,就用DECIMAL比較合理,注意浮點數(shù)在進(jìn)行加減運算時也容易出現(xiàn)問題。如果進(jìn)行數(shù)值比較,也建議用DECIMAL

3、日期與時間類型

  可以看上面詳解時的圖,根據(jù)各種格式,選擇自己所需要的數(shù)據(jù)類型,注意TIMESTAMP和DATETIME的區(qū)別,一個是跟時區(qū)有關(guān),一個無關(guān),其他沒什么大的區(qū)別。

4、CHAR與VARCHAR之間的特點與選擇

  區(qū)別:

    CHAR是固定長度字符、VARCHAR是可變長度字符。CHAR會自動刪除插入數(shù)據(jù)的尾部空格,VARCHAR不會。
    CHAR是固定長度,處理速度比VARCHAR更快,缺點很明顯,浪費存儲空間,所以對存儲不大,但在速度上有要求的可以使用CHAR類型,反之用VARCHAR。

5、ENUM和SET

   ENUM只能取單值,也就是從枚舉類型中選取其中一個值,但是SET可以取多值,
   ENUM最多能存放65535個成員,SET只能65個
   空字符串也能在SET中存儲,

   要存儲一個人的喜愛時,最好使用SET類型,其實最重要的是看具體的情況在選取最為合適的把

6、BLOB和TEXT

   BLOB是二進(jìn)制字符串,TEXT是非二進(jìn)制字符串,兩者均可存放大容量的信息,BLOB主要存儲圖片、音頻信息,而TEXT只能存儲純文本文件。分清楚兩者的用途

7、BINARY和VARBINARY

   這兩個的區(qū)別和CHAR與VARCHAR的區(qū)別差不多,BINARY是固定長度、VARBINARY是可變程度,這兩個的作用就是為了區(qū)分大小寫的,注意這兩個是字節(jié)字符串。

您可能感興趣的文章:
  • 基于PostgreSQL和mysql數(shù)據(jù)類型對比兼容
  • MySQL數(shù)據(jù)類型優(yōu)化原則
  • 詳解MySQL中的數(shù)據(jù)類型和schema優(yōu)化
  • MyBatis JdbcType 與Oracle、MySql數(shù)據(jù)類型對應(yīng)關(guān)系說明
  • 深入分析MySQL數(shù)據(jù)類型 DECIMAL
  • mysql數(shù)據(jù)類型和字段屬性原理與用法詳解
  • mysql8.0.19基礎(chǔ)數(shù)據(jù)類型詳解
  • 詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義
  • MySQL操作之JSON數(shù)據(jù)類型操作詳解
  • MySQL數(shù)據(jù)類型全解析

標(biāo)簽:仙桃 湘潭 黃山 崇左 蘭州 衡水 銅川 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL入門(二) 數(shù)據(jù)庫數(shù)據(jù)類型詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    昔阳县| 呼图壁县| 城固县| 绥宁县| 九龙县| 腾冲县| 筠连县| 昭觉县| 西平县| 永吉县| 丰宁| 吴川市| 农安县| 巴南区| 敖汉旗| 陆丰市| 山阳县| 昌图县| 祁东县| 红桥区| 信宜市| 六盘水市| 米林县| 固安县| 四会市| 桐梓县| 亳州市| 东港市| 宜丰县| 福清市| 怀仁县| 舞阳县| 乌鲁木齐市| 张家口市| 盈江县| 吉木萨尔县| 嘉禾县| 桦南县| 夏津县| 攀枝花市| 海兴县|