乱码乱a∨中文字幕,在线免费激情视频,亚洲欧美久久夜夜潮,国产在线网址

  1. <sub id="hjl7n"></sub>

    1. <sub id="hjl7n"></sub>

      <legend id="hjl7n"></legend>

      當前位置:首頁 >  站長 >  數(shù)據(jù)庫 >  正文

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

       2020-11-05 13:37  來源: 腳本之家   我來投稿 撤稿糾錯

        阿里云優(yōu)惠券 先領券再下單

      這篇文章主要介紹了MYSQL中 char 和 varchar的區(qū)別,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

      CHAR和VARCHAR類型相似,差別主要在存儲,尾隨空格和檢索方式上。

      CHAR和VARCHAR相同的是:CHAR和VARCHAR都指定了字符長度,注意是字符長度。例如char(30) 和 varchar(30)表示都可以存30個字符。有一點要注意的是在utf8mb4編碼中,每個字符占4個節(jié)點。在utf8中,每個字符占3個字節(jié)。當要存儲的字符超過CHAR/VARCHAR指定的最大長度。在sql mode 沒開啟的時候是截斷要存儲的字串,只存儲前30位

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

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

      與CHAR不同的是,VARCHAR在存儲數(shù)據(jù)的時候,會額外存儲存儲1-2個字節(jié)(例如varchar(4),這1-2個字節(jié)長度不會算在這4個字符長度里面,不用擔心被截斷),這1-2個字節(jié)用來記錄數(shù)據(jù)字符的長度。假如數(shù)據(jù)字符長度小于等于255,則使用1個字節(jié)記錄數(shù)據(jù)長度。大于則用兩個字節(jié)。CHAR只存儲數(shù)據(jù)本身。如下圖所示。

      (誤區(qū):varchar在查詢時比char慢是因為會計算varchar的字節(jié)長度(X))

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

      QQ截圖20201105133351

      需要注意的是VARCHAR值在存儲時不填充空格。在存儲和檢索值時,尾部空格將被保留,這與標準SQL一致。而CHAR則相反,CHAR在儲存時會填充空格,在檢索時尾部空格會去掉,無論這個尾部空格是自動填充的還是數(shù)據(jù)本身的。舉個例子:

      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)


      做三個實驗。

      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.查詢語句 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.查詢語句 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)


      在所有字符串的比較中,不論是varchar,text,char 都會忽略去掉尾部空格,除了like子句,like子句不會去掉尾部空格如下所示

      mysql> SELECT concat('(',v, ')'),concat('(',c, ')') FROM vipshop_dba.vc where c like 'ab'; (無尾部空格)
      +--------------------+--------------------+
      | 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在儲存時會填充空格,在檢索時尾部空格會去掉,無論這個尾部空格是自動填充的還是數(shù)據(jù)本身的。這個去掉尾部空格的動作在比較之前會發(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'; (無尾部空格)
      Empty set (0.00 sec)

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

      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)
      說明雖然varchar 尾部空格可以保留,但是索引上似乎額外做了限制。如果varchar是唯一索引,插入的值區(qū)別只在于尾部空格的數(shù)量的話則會報 Duplicate key

      說到字節(jié)限制這個問題,也想提醒一下。索引長度也是有限制的噢:

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

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

      在MySQL5.7里默認 innodb_large_prefix=1 解除了767bytes長度限制,但是單列索引長度最大還是不能超過3072bytes

      在MySQL5.6里默認 innodb_large_prefix=0 限制單列索引長度不能超過767bytes。需要設置innodb_large_prefix=ON、innodb_file_format=barracuda、innodb_file_per_table=ON ,且Innodb表的存儲格式為 DYNAMIC 或 COMPRESSED,則前綴索引最多可包含3072個字節(jié)

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

      來源:腳本之家

      鏈接:https://www.jb51.net/article/195534.htm

      申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!

      相關標簽
      mysql

      相關文章

      • MySQL5.7 集群配置的步驟

        這篇文章主要介紹了MySQL5.7集群配置的步驟,幫助大家更好的理解和學習使用MySQL,感興趣的朋友可以了解下

        標簽:
        mysql
      • MySQL中觸發(fā)器和游標的介紹與使用

        這篇文章主要給大家介紹了關于MySQL中觸發(fā)器和游標的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

        標簽:
        mysql
      • MySQL中exists、in及any的基本用法

        這篇文章主要給大家介紹了關于MySQL中exists、in及any的基本用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

        標簽:
        mysql
      • MySQL正確修改最大連接數(shù)的3種方案

        這篇文章主要給大家介紹了關于MySQL正確修改最大連接數(shù)的3種方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

        標簽:
        mysql
      • 教你怎么在Windows系統(tǒng)上手動搭建MySql數(shù)據(jù)庫

        1.已經購買好的騰訊云輕量應用服務器。2.作者本次演示使用的系統(tǒng)是WindowsServer2019,其他windows版本也可以,操作流程大同小異。3.使用Windows遠程桌面連接騰訊云輕量服務器。

      熱門排行

      信息推薦