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