你知道 varchar(N) 或 varchar2(N) 中的 N 是字符数还是字节数?
- 2020 年 2 月 13 日
- 筆記
1、MySQL 数据库
以 MySQL 5.7 版本为例,数据库编码:utf8mb4
创建 t_book
表,创建表语句如下所示:
create table t_book ( book_id int(11) auto_increment primary key, book_name varchar(20) not null );
其中 book_name
是 varchar(20)
类型。 插入 sql 语句如下:
insert into t_book (book_name) VALUES ('你好你好你好你好你好你好你好你好你好你好'); insert into t_book (book_name) VALUES ('hellohellohellohello');
插入成功;
insert into t_book (book_name) VALUES ('你好你好你好你好你好你好你好你好你好你好!'); insert into t_book (book_name) VALUES ('hellohellohellohello!');
插入失败;
从上面的测试可以看出,varchar(20)
中的20
表示字符 ,一个汉字或是一个字母表示一个字符。
- 一个汉字占 3 个字节(utf8编码)
- 一个汉字占 2 个字节(gbk编码)
结论:MySQL 5.7 版本 varchar(N)
字段类型中的 N
是字符数。
2、Orcale 数据库
以 Orcale 11g 版本为例,数据库编码:utf8
同样创建 t_book
表,创建表语句如下所示:
create table t_book ( book_id number(11) primary key, book_name varchar2(20) not null );
插入 sql 语句如下(同上):
insert into t_book (book_id, book_name) VALUES ('1', '你好你好你好你好你好你好你好你好你好你好'); insert into t_book (book_id, book_name) VALUES ('2', 'hellohellohellohello');
插入失败;
查看表t_book
结构,如下图所示:

建表语句中varchar2(20)
指的是varchar2(20 byte)
(默认),即字节数。 由于数据库字符集编码是ZHS16GBK
,book_name
字段最多存储20/2 = 10
个汉字。 示例如下:
insert into t_book (book_id, book_name) VALUES ('1', '你好你好你好你好你好'); insert into t_book (book_id, book_name) VALUES ('2', 'abcdeabcdeabcdeabcde');
插入成功; 从上面的 sql 插入语句可以看出,在 Oracle 中(ZHS16GBK编码),字段类型是varchar2(20 byte)
时,一个汉字占 2 个字节,一个字母占 1 一个字节。
在 Orcale 中可以显示的指定varchar2(N)
中的 N
是字节数还是字符数。sql 新增字段语句如下所示:
alter table t_book add book_desc varchar2(20 char);
再次查看表t_book
结构,如下图所示:

此时建表语句中的字段 book_desc varchar2(20 char)
指的是字符数。 示例如下:
insert into t_book (book_id, book_name, book_desc) VALUES ('3', '你好你好你好你好你好', '你好你好你好你好你好你好你好你好你好你好'); insert into t_book (book_id, book_name, book_desc) VALUES ('4', 'abcdeabcdeabcdeabcde', 'abcdeabcdeabcdeabcde');
插入成功; 从上面的 sql 插入语句可以看出,在 Oracle 中(ZHS16GBK编码),字段类型是varchar2(20 char)
时,一个汉字占 1 个字符,一个字母占 1 一个字符。
结论:Oracle 11g 版本 varchar2(N)
和varchar2(N byte)
字段类型中的 N
是字节数,其中一个汉字占 2 个字节,一个字母占 1 一个字节。varchar2(N char)
字段类型中的 N
是字符数,其中一个汉字占 1 个字符,一个字母占 1 一个字符。
3. 小结
varchar(N) 或 varchar2(N) 中的 N 是字符还是字节?现在你弄清楚了吗?如果还不清楚,请动手试试。 MySQL 5.7 版本 varchar(N)
字段类型中的 N
是字符数,其中一个汉字或是一个字母表示一个字符。 Oracle 11g 版本 varchar2(N)
和varchar2(N byte)
字段类型中的 N
是字节数,其中一个汉字占 2 个字节,一个字母占 1 一个字节。varchar2(N char)
字段类型中的 N
是字符数,其中一个汉字占 1 个字符,一个字母占 1 一个字符。 所以针对不同的关系型数据库管理系统,字段类型varchar(N)
中的N
表示的含义是不同的,以实际情况而定。所以不要轻易下结论,实践是检验真理的唯一标准。