真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解MySQL中的varchar(N)

本篇文章給大家分享的是有關(guān)如何理解MySQL中的 varchar(N),小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)科技有限公司專業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供服務(wù)器托管雅安,高防服務(wù)器,成都IDC機(jī)房托管,成都主機(jī)托管等互聯(lián)網(wǎng)服務(wù)。

一  前言
  varchar(N) N代表什么意思,能存放多少個(gè)中文字符?屬于老生常談的問(wèn)題了,今天又被一個(gè)開(kāi)發(fā)同事問(wèn)我關(guān)于這個(gè)問(wèn)題,索性寫(xiě)一篇文章來(lái)具體介紹一下。

二 理論知識(shí)

 先說(shuō)明一下 MySQL 歷來(lái)版本對(duì) varchar 的定義: 
   4.0版本以下,varchar(50),指的是50字節(jié),如果存放UTF8漢字時(shí),只能存16個(gè)(每個(gè)中文3字節(jié))
   5.0版本以上,varchar(50),指的是50字符,無(wú)論存放的是數(shù)字、字母還是UTF8中文(每個(gè)中文3字節(jié)),都可以存放50個(gè) 
 存儲(chǔ)限制
   需要額外占用字節(jié)存放字符的長(zhǎng)度:小于255為1個(gè)字節(jié),大于255則要2個(gè)字節(jié)
 編碼限制
   gbk :每個(gè)字符最多占用2個(gè)字節(jié)
   utf8:每個(gè)字符最多占用3個(gè)字節(jié)
   utf8mb4 每個(gè)字符最多占用4個(gè)字節(jié),中文占3個(gè)字節(jié),emoji表情符號(hào) 占用4個(gè)字節(jié) 
 長(zhǎng)度限制
   MySQL定義行的長(zhǎng)度不能超過(guò)65535,該數(shù)值限制了列的數(shù)目,比如char(128) utf8字符集,最多有65535/(128*3)=170個(gè)漢字。

三 測(cè)試
環(huán)境 Server version: 5.6.26-74.0-log Percona Server  
mysql> create table  t1
    -> (id int  NOT NULL AUTO_INCREMENT    primary key,
    ->  name  varchar(10)
    -> ) engine=innodb default charset=utf8mb4;
Query OK, 0 rows affected (0.01 sec)
mysql> create table  t2
    -> (id int  NOT NULL AUTO_INCREMENT    primary key,
    ->  name  varchar(10)
    -> ) engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> create table t3
    -> (id int  NOT NULL AUTO_INCREMENT    primary key,
    ->  name  varchar(10)
    -> ) engine=innodb default charset=gbk;
Query OK, 0 rows affected (0.01 sec)
utf8mb4 字符集
mysql> insert into t1(name) values('abcdfeghi');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1(name) values('abcdfeghij');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1(name) values('abcdfeghijk');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t1(name) values('一二三四五六七八九十');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1(name) values('一二三四五六七八九十一');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into t1(name) values('0123456789');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t1(name) values('01234567890');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select id,name,length(name),char_length(name) from t1;
+----+--------------------------------+--------------+-------------------+
| id | name                           | length(name) | char_length(name) |
+----+--------------------------------+--------------+-------------------+
|  1 | abcdfeghi                      |            9 |                 9 |
|  2 | abcdfeghij                     |           10 |                10 |
|  3 | abcdfeghij                     |           10 |                10 |
|  4 | 一二三四五六七八九十              |           30 |                10 |
|  5 | 一二三四五六七八九十              |           30 |                10 |
|  6 | 0123456789                     |           10 |                10 |
|  7 | 0123456789                     |           10 |                10 |
+----+--------------------------------+--------------+-------------------+
7 rows in set (0.00 sec)
utf8 字符集
mysql> insert into t2(name) values('abcdfeghi');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2(name) values('abcdfeghij');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2(name) values('abcdfeghijk');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t2(name) values('一二三四五六七八九十');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2(name) values('一二三四五六七八九十一');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t2(name) values('0123456789');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t2(name) values('01234567890');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select id,name,length(name),char_length(name) from t2;
+----+--------------------------------+--------------+-------------------+
| id | name                           | length(name) | char_length(name) |
+----+--------------------------------+--------------+-------------------+
|  1 | abcdfeghi                      |            9 |                 9 |
|  2 | abcdfeghij                     |           10 |                10 |
|  3 | abcdfeghij                     |           10 |                10 |
|  4 | 一二三四五六七八九十              |           30 |                10 |
|  5 | 一二三四五六七八九十              |           30 |                10 |
|  6 | 0123456789                     |           10 |                10 |
|  7 | 0123456789                     |           10 |                10 |
+----+--------------------------------+--------------+-------------------+
7 rows in set (0.00 sec)
gbk 字符集
mysql> insert into t3(name) values('abcdfeghi');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t3(name) values('abcdfeghij');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t3(name) values('abcdfeghijk');
Query OK, 1 row affected, 1 warning (0.00 sec) 
mysql> insert into t3(name) values('一二三四五六七八九十');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t3(name) values('一二三四五六七八九十一');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> insert into t3(name) values('0123456789');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t3(name) values('01234567890');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select id,name,length(name),char_length(name) from t3;
+----+--------------------------------+--------------+-------------------+
| id | name                           | length(name) | char_length(name) |
+----+--------------------------------+--------------+-------------------+
|  1 | abcdfeghi                      |            9 |                 9 |
|  2 | abcdfeghij                     |           10 |                10 |
|  3 | abcdfeghij                     |           10 |                10 |
|  4 | 一二三四五六七八九十              |           20 |                10 |
|  5 | 一二三四五六七八九十              |           20 |                10 |
|  6 | 一二三四五六七八九十              |           20 |                10 |
|  7 | 0123456789                     |           10 |                10 |
|  8 | 0123456789                     |           10 |                10 |
+----+--------------------------------+--------------+-------------------+
8 rows in set (0.00 sec)
   從上面的測(cè)試可以看出,目前版本中 varchar(N) 定義的長(zhǎng)度的單位是字符,length(str)表示str占用的字節(jié)數(shù),char_length(str)表示str占用的字符數(shù)。
不論什么字符集,對(duì)于數(shù)字和英文字母都是只占用1個(gè)字符,也占用一個(gè)字節(jié)。而中文漢字因字符集不同而不同。

四 總結(jié)
   回過(guò)頭來(lái)回答文章開(kāi)頭的問(wèn)題varchar(N)可以存放多少個(gè)中文漢字。答案是在 5.0 以后的版本中 varchar(N) 可以存放N個(gè)漢字 。
   拋開(kāi)字符集 ,如果一行數(shù)據(jù)全部為 varchar 類型,其最大長(zhǎng)度為 65535 個(gè)字節(jié)。
行長(zhǎng)度計(jì)算公式如下:
row length = 1
           + (sum of column lengths)
           + (number of NULL columns + delete_flag + 7)/8
           + (number of variable-length columns)
 對(duì)于MyISAM,需要額外1個(gè)位來(lái)記錄值是否為NULL;對(duì)于InnoDB,沒(méi)有區(qū)別
 對(duì)于row_format為fixed,delete_flag為1;對(duì)于row_format=dynamic,delete_flag為0

根據(jù)這個(gè)公式,我們便能夠解答開(kāi)頭N的最大值:(65535-1-2)/3
減1是因?yàn)閷?shí)際存儲(chǔ)從第2個(gè)字節(jié)開(kāi)始
減2則因?yàn)橐诹斜黹L(zhǎng)度存儲(chǔ)實(shí)際字符長(zhǎng)度
除3是因?yàn)閡tf8編碼限制
再來(lái)一道:
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
N的最大值:(65535-1-2-4-30*3)/3
則此處N的最大值為 (65535-1-2-4-30*3)/3=21812
減1和減2與上例相同;
減4的原因是int類型的c占4個(gè)字節(jié);
減30*3的原因是char(30)占用90個(gè)字節(jié),編碼是utf8。
如果被varchar超過(guò)上述的b規(guī)則,被強(qiáng)轉(zhuǎn)成text類型,則每個(gè)字段占用定義長(zhǎng)度為11字節(jié),當(dāng)然這已經(jīng)不是“varchar”了。

以上就是如何理解MySQL中的 varchar(N),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前標(biāo)題:如何理解MySQL中的varchar(N)
URL標(biāo)題:http://weahome.cn/article/gogcoc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部