MySQL中VARCHAR與CHAR格式數(shù)據(jù)的區(qū)別
區(qū)別
CHAR與VARCHAR類型類似,但它們保存和檢索的方式不同。CHAR有固定的長(zhǎng)度,而VARCHAR屬于可變長(zhǎng)的字符類型。它們最大長(zhǎng)度和是否尾部空格被保留等方面也不同。在存儲(chǔ)和檢索過(guò)程中不進(jìn)行大小寫轉(zhuǎn)換。
下面的表格顯示了將各種字符串值保存到CHAR(4)和VARCHAR(4)列后的結(jié)果,說(shuō)明了CHAR和VARCHAR之間的差別:
值 CHAR(4) 存儲(chǔ)需求 VARCHAR(4) 存儲(chǔ)需求
'' ' ' 4個(gè)字節(jié) '' 1個(gè)字節(jié)
'ab' 'ab ' 4個(gè)字節(jié) 'ab' 3個(gè)字節(jié)
'abcd' 'abcd' 4個(gè)字節(jié) 'abcd' 5個(gè)字節(jié)
'abcdefgh' 'abcd' 4個(gè)字節(jié) 'abcd' 5個(gè)字節(jié)
從上面可以看得出來(lái)CHAR的長(zhǎng)度是固定的,不管你存儲(chǔ)的數(shù)據(jù)是多少他都會(huì)都固定的長(zhǎng)度。而VARCHAR則處可變長(zhǎng)度但他要在總長(zhǎng)度上加1字節(jié),這個(gè)用來(lái)存儲(chǔ)字符長(zhǎng)度(如果聲明的長(zhǎng)度超過(guò)255,則使用2個(gè)字節(jié))。所以實(shí)際應(yīng)用中用戶可以根據(jù)自己的數(shù)據(jù)類型來(lái)做。
請(qǐng)注意,上表中最后一行的值只適用不使用嚴(yán)格模式時(shí);如果MySQL運(yùn)行在嚴(yán)格模式,超過(guò)列長(zhǎng)度的值不被保存,并且會(huì)出現(xiàn)錯(cuò)誤。
從CHAR(4)和VARCHAR(4)列檢索的值并不總是相同,因?yàn)闄z索時(shí)從CHAR列刪除了尾部的空格。通過(guò)下面的例子說(shuō)明差別:
mysql> CREATE TABLE test(a VARCHAR(4), b CHAR(4)); mysql> INSERT INTO test VALUES ('ab ', 'ab '); mysql> SELECT CONCAT(a, '+'), CONCAT(b, '+') FROM test;
結(jié)果如下:
CONCAT(a, '+') CONCAT(b, '+') ab + ab+
從上面可以看出來(lái),由于某種原因CHAR有固定長(zhǎng)度,所以在處理速度上要比VARCHAR快很多,但是相對(duì)浪費(fèi)存儲(chǔ)空間,所以對(duì)存儲(chǔ)不大,但在速度上有要求的可以使用CHAR類型,反之可以用VARCHAR類型來(lái)實(shí)現(xiàn)。
建議
MyISAM存儲(chǔ)引擎 建議使用固定長(zhǎng)度,數(shù)據(jù)列代替可變長(zhǎng)度的數(shù)據(jù)列
INNODB 存儲(chǔ)引擎 建議使用VARCHAR類型
總結(jié)分析:
文字字段若長(zhǎng)度固定,如:身分證號(hào)碼,就不要用 varchar 或 nvarchar,應(yīng)該用 char 或 nchar。
支持多語(yǔ)言的站點(diǎn)應(yīng)考慮使用 Unicode nchar 或 nvarchar 數(shù)據(jù)類型以盡量減少字符轉(zhuǎn)換問(wèn)題
文字字段若長(zhǎng)度不固定,如:地址,則該用 varchar 或 nvarchar。除了可節(jié)省存儲(chǔ)空間外,存取硬盤時(shí)也會(huì)較有效率
- sql中的char與varchar有什么區(qū)別
- MySQL中varchar和char類型的區(qū)別
- MYSQL中 char 和 varchar的區(qū)別
- Oralce中VARCHAR2()與NVARCHAR2()的區(qū)別介紹
- MySQL數(shù)據(jù)庫(kù)char與varchar的區(qū)別分析及使用建議
- 深入SQL Server中定長(zhǎng)char(n)與變長(zhǎng)varchar(n)的區(qū)別詳解
- 深入SQL Server中char、varchar、text和nchar、nvarchar、ntext的區(qū)別詳解
- Sqlserver中char,nchar,varchar與Nvarchar的區(qū)別分析
- 詳解數(shù)據(jù)庫(kù)varchar與char有哪些區(qū)別
相關(guān)文章
淺談一下MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別
這篇文章主要介紹了MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別,存儲(chǔ)引擎是MySQL中特有的一個(gè)術(shù)語(yǔ),其它數(shù)據(jù)庫(kù)中沒(méi)有,實(shí)際上存儲(chǔ)引擎是一個(gè)表存儲(chǔ)/組織數(shù)據(jù)的方式,今天就跟小編來(lái)看看MyISAM和InnoDB存儲(chǔ)引擎的區(qū)別,需要的朋友可以參考下2023-04-04MySQL性能優(yōu)化之table_cache配置參數(shù)淺析
這篇文章主要介紹了MySQL性能優(yōu)化之table_cache配置參數(shù)淺析,本文介紹了它的緩存機(jī)制、參數(shù)優(yōu)化及清空緩存的命令等,需要的朋友可以參考下2014-07-07MySQL生產(chǎn)庫(kù)Insert了2次同樣的記錄但是主鍵ID是不一樣的問(wèn)題的分析過(guò)程
這篇文章主要介紹了MySQL生產(chǎn)庫(kù)Insert了2次同樣的記錄但是主鍵ID是不一樣的問(wèn)題的分析過(guò)程,需要的朋友可以參考下2014-02-02mysql使用教程之分區(qū)表的使用方法(刪除分區(qū)表)
mysql分區(qū)表使用方法,新增分區(qū)、刪除分區(qū)、分區(qū)的合并、分區(qū)的拆分等使用方法2013-12-12解決MySQL登錄報(bào)錯(cuò)1045-Access?denied?for?user?'root'@
這篇文章主要給大家介紹了關(guān)于解決MySQL登錄報(bào)錯(cuò)1045-Access?denied?for?user?‘root‘@‘‘(using?password:YES)的相關(guān)資料,文中一步步將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07淺談sql連接查詢的區(qū)別 inner,left,right,full
下面小編就為大家?guī)?lái)一篇淺談sql連接查詢的區(qū)別 inner,left,right,full。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10