天天看点

你知道 varchar(N) 或 varchar2(N) 中的 N 是字符数还是字节数?

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

结构,如下图所示:

你知道 varchar(N) 或 varchar2(N) 中的 N 是字符数还是字节数?

建表语句中

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

结构,如下图所示:

你知道 varchar(N) 或 varchar2(N) 中的 N 是字符数还是字节数?

此时建表语句中的字段 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

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