《MySQL系列-开发相关》MySQL的varchar(n)能存储几个字符?占多少字节?
Posted DATA数据猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《MySQL系列-开发相关》MySQL的varchar(n)能存储几个字符?占多少字节?相关的知识,希望对你有一定的参考价值。
mysql的varchar(n)能存储几个字符?占多少字节?
网上各种说法不一,只能简单测试一下,结果如下:
MySQL的varchar(n),无论是英文字符还是中文,都可以插入n个字符,但是实际存储的大小不同。
当字符集是utf8时,一个英文占1个字节,一个中文占3个字节。
当字符集是gbk时,一个英文占1个字节,一个中文占2个字节。
当字符是latin1时,一个英文占1个字节。
一、UTF-8
# 1.innodb引擎,utf8字符集
mysql> create table char_utf8(
-> t1 int not null auto_increment,
-> t2 varchar(10) null,
-> primary key (t1)
-> ) engine=innodb default charset=utf8;
Query OK, 0 rows affected (0.05 sec)
# 2.字段t2插入10个英文字符 成功
mysql> insert into char_utf8(t2) values('aaaaaaaaaa');
Query OK, 1 row affected (0.01 sec)
# 3.字段t2插入11个英文字符 失败
mysql> insert into char_utf8(t2) values('aaaaaaaaaaa');
ERROR 1406 (22001): Data too long for column 't2' at row 1
# 4.字段t2插入10个中文字符 成功
mysql> insert into char_utf8(t2) values('测试测试测试测试测试');
Query OK, 1 row affected (0.01 sec)
# 5.字段t2插入11个中文字符 失败
mysql> insert into char_utf8(t2) values('测试测试测试测试测试测');
ERROR 1406 (22001): Data too long for column 't2' at row 1
# 6.一个英文字符占1个字节,一个中文字符占3个字节
mysql> select t2,length(t2) from char_utf8 ;
+--------------------------------+------------+
| t2 | length(t2) |
+--------------------------------+------------+
| aaaaaaaaaa | 10 |
| 测试测试测试测试测试 | 30 |
+--------------------------------+------------+
2 rows in set (0.00 sec)
二、GBK
# 1.innodb引擎,gbk字符集
mysql> create table char_gbk(
-> t1 int not null auto_increment,
-> t2 varchar(10) null,
-> primary key (t1)
-> ) engine=innodb default charset=gbk;
Query OK, 0 rows affected (0.04 sec)
# 2.插入10个英文字符 成功
mysql> insert into char_gbk(t2) values('aaaaaaaaaa');
Query OK, 1 row affected (0.02 sec)
# 3.插入11个英文字符 失败
mysql> insert into char_gbk(t2) values('aaaaaaaaaaa');
ERROR 1406 (22001): Data too long for column 't2' at row 1
# 4.插入10个中文字符 成功
mysql> insert into char_gbk(t2) values('测试测试测试测试测试');
Query OK, 1 row affected (0.01 sec)
# 5.插入11个中文字符 失败
mysql> insert into char_gbk(t2) values('测试测试测试测试测试测');
ERROR 1406 (22001): Data too long for column 't2' at row 1
# 6.一个英文字符占1个字节,一个中文字符占2个字节
mysql> select t2,length(t2) from char_gbk;
+--------------------------------+------------+
| t2 | length(t2) |
+--------------------------------+------------+
| aaaaaaaaaa | 10 |
| 测试测试测试测试测试 | 20 |
+--------------------------------+------------+
2 rows in set (0.00 sec)
三、Latin1
# 1.Innodb引擎,Latin1字符集
mysql> create table char_latin1(
-> t1 int not null auto_increment,
-> t2 varchar(10) null,
-> primary key (t1)
-> ) engine=innodb default charset=latin1;
Query OK, 0 rows affected (0.06 sec)
# 2.插入10个英文字符 成功
mysql> insert into char_latin1(t2) values('aaaaaaaaaa');
Query OK, 1 row affected (0.01 sec)
# 3.插入11个英文字符 失败
mysql> insert into char_latin1(t2) values('aaaaaaaaaaa');
ERROR 1406 (22001): Data too long for column 't2' at row 1
# 4.插入中文字符 失败 不支持
mysql> insert into char_latin1(t2) values('测试测试测试测试测试');
ERROR 1366 (HY000): Incorrect string value: '\\xE6\\xB5\\x8B\\xE8\\xAF\\x95...' for column 't2' at row 1
# 5.一个英文字符占1字节
mysql> select t2,length(t2) from char_latin1;
+------------+------------+
| t2 | length(t2) |
+------------+------------+
| aaaaaaaaaa | 10 |
+------------+------------+
1 row in set (0.00 sec)
以上是关于《MySQL系列-开发相关》MySQL的varchar(n)能存储几个字符?占多少字节?的主要内容,如果未能解决你的问题,请参考以下文章
《MySQL系列-主从相关》Docker安装MySQL,实现主从复制
Linux命令:MySQL系列之八--MySQL事务相关内容