天天看點

你知道 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

表示的含義是不同的,以實際情況而定。是以不要輕易下結論,實踐是檢驗真理的唯一标準。