你知道 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_namevarchar(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)(默认),即字节数。 由于数据库字符集编码是ZHS16GBKbook_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表示的含义是不同的,以实际情况而定。所以不要轻易下结论,实践是检验真理的唯一标准。