《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 开发基础系列15 索引的设计和使用

MySQL系列教程

《MySQL系列-主从相关》Docker安装MySQL,实现主从复制

Linux命令:MySQL系列之八--MySQL事务相关内容

Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁

Mysql系列-性能优化神器EXPLAIN使用介绍及分析