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
表示的含义是不同的,以实际情况而定。所以不要轻易下结论,实践是检验真理的唯一标准。