欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MYSQL中 char 和 varchar的區(qū)別

 更新時(shí)間:2020年09月14日 08:34:10   作者:從零開(kāi)始的DBA生活  
這篇文章主要介紹了MYSQL中 char 和 varchar的區(qū)別,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下

CHAR和VARCHAR類(lèi)型相似,差別主要在存儲(chǔ),尾隨空格和檢索方式上。

CHAR和VARCHAR相同的是:CHAR和VARCHAR都指定了字符長(zhǎng)度,注意是字符長(zhǎng)度。例如char(30) 和 varchar(30)表示都可以存30個(gè)字符。有一點(diǎn)要注意的是在utf8mb4編碼中,每個(gè)字符占4個(gè)節(jié)點(diǎn)。在utf8中,每個(gè)字符占3個(gè)字節(jié)。當(dāng)要存儲(chǔ)的字符超過(guò)CHAR/VARCHAR指定的最大長(zhǎng)度。在sql mode 沒(méi)開(kāi)啟的時(shí)候是截?cái)嘁鎯?chǔ)的字串,只存儲(chǔ)前30位

CHAR列中的值是定長(zhǎng)的字符串。長(zhǎng)度可以指定為0到255個(gè)字符(例如utf8mb4: 0-255*4個(gè)字節(jié))之間的值當(dāng)使用CHAR存儲(chǔ)字符時(shí),以CHAR(30)為例,不夠30個(gè)字符的以空格向右填充。當(dāng)檢索CHAR值時(shí),除非啟用sqlmode:PAD_CHAR_TO_FULL-LENGTH SQL模式,否則將刪除尾部空格。

VARCHAR列中的值是可變長(zhǎng)度的字符串。長(zhǎng)度可以指定為0到65535字節(jié)之間的值。VARCHAR的有效最大長(zhǎng)度取決于最大行大小(65535字節(jié),在所有列之間共享)和使用的字符集

與CHAR不同的是,VARCHAR在存儲(chǔ)數(shù)據(jù)的時(shí)候,會(huì)額外存儲(chǔ)存儲(chǔ)1-2個(gè)字節(jié)(例如varchar(4),這1-2個(gè)字節(jié)長(zhǎng)度不會(huì)算在這4個(gè)字符長(zhǎng)度里面,不用擔(dān)心被截?cái)啵?,這1-2個(gè)字節(jié)用來(lái)記錄數(shù)據(jù)字符的長(zhǎng)度。假如數(shù)據(jù)字符長(zhǎng)度小于等于255,則使用1個(gè)字節(jié)記錄數(shù)據(jù)長(zhǎng)度。大于則用兩個(gè)字節(jié)。CHAR只存儲(chǔ)數(shù)據(jù)本身。如下圖所示。

(誤區(qū):varchar在查詢時(shí)比char慢是因?yàn)闀?huì)計(jì)算varchar的字節(jié)長(zhǎng)度(X))

在latin1編碼中,Latin1不能存中文。英文字母為1個(gè)字節(jié)。

Value CHAR(4) Storage Required VARCHAR(4) Storage Required
'' ' ' 4 bytes '' 1 byte
'ab' 'ab ' 4 bytes 'ab' 3 byte
'abcd' 'abcd' 4 bytes 'abcd' 5 byte
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 byte

需要注意的是VARCHAR值在存儲(chǔ)時(shí)不填充空格。在存儲(chǔ)和檢索值時(shí),尾部空格將被保留,這與標(biāo)準(zhǔn)SQL一致。而CHAR則相反,CHAR在儲(chǔ)存時(shí)會(huì)填充空格,在檢索時(shí)尾部空格會(huì)去掉,無(wú)論這個(gè)尾部空格是自動(dòng)填充的還是數(shù)據(jù)本身的。舉個(gè)例子:

mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)
 
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab )    | (ab)    |
+---------------------+---------------------+
1 row in set (0.06 sec)<br><br><br>

做三個(gè)實(shí)驗(yàn)。

mysql> show create table vc;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                   |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| vc | CREATE TABLE `vc` (
 `v` varchar(4) DEFAULT NULL,
 `c` char(4) DEFAULT NULL,
 UNIQUE KEY `v_UNIQUE` (`v`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

1.查詢語(yǔ)句 where 字段=' ab';

mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where v='    ab';
Empty set (0.00 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where c='     ab';
Empty set (0.00 sec)

2.查詢語(yǔ)句 where 字段='ab ';

mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where v='ab    ';
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab )    | (ab)    |
+--------------------+--------------------+
1 row in set (0.00 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vc where c='ab    ';
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab )    | (ab)    |
+--------------------+--------------------+
1 row in set (0.00 sec)<br><br><br>在所有字符串的比較中,不論是varchar,text,char 都會(huì)忽略去掉尾部空格,除了like子句,like子句不會(huì)去掉尾部空格如下所示<br><br>
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where c like 'ab'; (無(wú)尾部空格)
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
| ( ab ) | (ab) |
+--------------------+--------------------+
2 rows in set (0.00 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where c like 'ab '; (有尾部空格)
Empty set (0.00 sec)
 
 
 
CHAR在儲(chǔ)存時(shí)會(huì)填充空格,在檢索時(shí)尾部空格會(huì)去掉,無(wú)論這個(gè)尾部空格是自動(dòng)填充的還是數(shù)據(jù)本身的。這個(gè)去掉尾部空格的動(dòng)作在比較之前會(huì)發(fā)生
 
 
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where v like 'ab '; (有尾部空格)
+--------------------+--------------------+
| concat('(',v, ')') | concat('(',c, ')') |
+--------------------+--------------------+
| (ab ) | (ab) |
+--------------------+--------------------+
1 row in set (0.01 sec)
 
mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where v like 'ab'; (無(wú)尾部空格)
Empty set (0.00 sec)

3.varchar 設(shè)置unique 索引 觀察 'ab' 和 'ab '是否同時(shí)能存在

mysql> insert into vc (v,c)values('ab  ', 'ab  ')
 -> ;
ERROR 1062 (23000): Duplicate entry 'ab ' for key 'v_UNIQUE'
mysql> insert into vc (v,c)values(' ab  ', 'ab  ')
 -> ;
Query OK, 1 row affected, 1 warning (0.00 sec)<br>說(shuō)明雖然varchar 尾部空格可以保留,但是索引上似乎額外做了限制。如果varchar是唯一索引,插入的值區(qū)別只在于尾部空格的數(shù)量的話則會(huì)報(bào) Duplicate key

說(shuō)到字節(jié)限制這個(gè)問(wèn)題,也想提醒一下。索引長(zhǎng)度也是有限制的噢:

innodb引擎的每個(gè)索引列長(zhǎng)度限制為767字節(jié)(bytes),所有組成索引列的長(zhǎng)度和不能大于3072字節(jié)。注意是字節(jié),varchar(256)在不同的編碼字節(jié)計(jì)算不同。例如在utf8mb4中,一個(gè)字符占4個(gè)字節(jié),256個(gè)字符=1024個(gè)字節(jié)。就達(dá)不到索引覆蓋的效果噢。相當(dāng)于只做了一個(gè)前綴索引(非常重要,前綴索引是需要回(主鍵)表的,二次查詢)

innodb引擎可以通過(guò)配置innodb_large_prefix=on(全局參數(shù),動(dòng)態(tài)生效)來(lái)讓單個(gè)索引列長(zhǎng)度限制上升到3072字節(jié)

  • 在MySQL5.7里默認(rèn) innodb_large_prefix=1 解除了767bytes長(zhǎng)度限制,但是單列索引長(zhǎng)度最大還是不能超過(guò)3072bytes
  • 在MySQL5.6里默認(rèn) innodb_large_prefix=0 限制單列索引長(zhǎng)度不能超過(guò)767bytes。需要設(shè)置innodb_large_prefix=ON、innodb_file_format=barracuda、innodb_file_per_table=ON ,且Innodb表的存儲(chǔ)格式為 DYNAMIC 或 COMPRESSED,則前綴索引最多可包含3072個(gè)字節(jié)

以上就是MYSQL中 char 和 varchar的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于MYSQL char 和 varchar的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 最全的mysql查詢語(yǔ)句整理

    最全的mysql查詢語(yǔ)句整理

    這篇文章主要介紹了最全的mysql查詢語(yǔ)句整理,需要的朋友可以參考下
    2016-06-06
  • MySQL臨時(shí)表的使用方法詳解

    MySQL臨時(shí)表的使用方法詳解

    在寫(xiě)查詢時(shí)我們會(huì)經(jīng)常用到臨時(shí)表來(lái)存儲(chǔ)數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL臨時(shí)表的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • mysql事務(wù)和隔離級(jí)別底層原理淺析

    mysql事務(wù)和隔離級(jí)別底層原理淺析

    大家好,本篇文章主要講的是mysql事務(wù)和隔離級(jí)別底層原理淺析,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2021-12-12
  • MySQL中IF語(yǔ)句的基礎(chǔ)及進(jìn)階用法

    MySQL中IF語(yǔ)句的基礎(chǔ)及進(jìn)階用法

    在Mysql數(shù)據(jù)庫(kù)中實(shí)現(xiàn)判斷功能有很多方式,具體又分為函數(shù)和if語(yǔ)句形式,下面這篇文章主要給大家介紹了關(guān)于MySQL中IF語(yǔ)句的基礎(chǔ)及進(jìn)階用法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Django連接本地mysql數(shù)據(jù)庫(kù)(pycharm)的步驟

    Django連接本地mysql數(shù)據(jù)庫(kù)(pycharm)的步驟

    這篇文章主要介紹了Django連接本地mysql數(shù)據(jù)庫(kù)(pycharm)的步驟,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • MySQL數(shù)據(jù)類(lèi)型和常用字段屬性總結(jié)

    MySQL數(shù)據(jù)類(lèi)型和常用字段屬性總結(jié)

    這篇文章主要介紹了MySQL數(shù)據(jù)類(lèi)型和常用字段屬性總結(jié),本文總結(jié)了日期和時(shí)間數(shù)據(jù)類(lèi)型、數(shù)值數(shù)據(jù)類(lèi)型、字符串?dāng)?shù)據(jù)類(lèi)型等,需要的朋友可以參考下
    2014-09-09
  • mysql中復(fù)制表結(jié)構(gòu)的方法小結(jié)

    mysql中復(fù)制表結(jié)構(gòu)的方法小結(jié)

    這篇文章主要介紹了mysql中復(fù)制表結(jié)構(gòu)的方法,需要的朋友可以參考下
    2014-07-07
  • mysql啟動(dòng)報(bào)錯(cuò)MySQL server PID file could not be found

    mysql啟動(dòng)報(bào)錯(cuò)MySQL server PID file could not be found

    這篇文章主要介紹了mysql啟動(dòng)報(bào)錯(cuò)MySQL server PID file could not be found,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 在MySQL現(xiàn)有表中添加自增ID的方法步驟

    在MySQL現(xiàn)有表中添加自增ID的方法步驟

    當(dāng)在MySQL數(shù)據(jù)庫(kù)中,自增ID是一種常見(jiàn)的主鍵類(lèi)型,它為表中的每一行分配唯一的標(biāo)識(shí)符,在某些情況下,我們可能需要在現(xiàn)有的MySQL表中添加自增ID,以便更好地管理和索引數(shù)據(jù),在本文中,我們將討論如何在MySQL現(xiàn)有表中添加自增ID,并介紹相關(guān)的步驟和案例
    2023-09-09
  • MySQL 索引優(yōu)化案例

    MySQL 索引優(yōu)化案例

    這篇文章主要介紹了MySQL 索引優(yōu)化案例,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-08-08

最新評(píng)論