前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你知道 varchar(N) 或 varchar2(N) 中的 N 是字符数还是字节数?

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

作者头像
IT技术小咖
发布2020-02-13 11:22:24
4K0
发布2020-02-13 11:22:24
举报
文章被收录于专栏:码上修行
1、MySQL 数据库
以 MySQL 5.7 版本为例,数据库编码:utf8mb4

创建 t_book 表,创建表语句如下所示:

代码语言:javascript
复制
create table t_book
(
    book_id int(11) auto_increment primary key,
    book_name varchar(20) not null
);

其中 book_namevarchar(20) 类型。 插入 sql 语句如下:

代码语言:javascript
复制
insert into t_book (book_name) VALUES ('你好你好你好你好你好你好你好你好你好你好');
insert into t_book (book_name) VALUES ('hellohellohellohello');

插入成功;

代码语言:javascript
复制
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 表,创建表语句如下所示:

代码语言:javascript
复制
create table t_book
(
    book_id number(11) primary key,
    book_name varchar2(20) not null
);

插入 sql 语句如下(同上):

代码语言:javascript
复制
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 个汉字。 示例如下:

代码语言:javascript
复制
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 新增字段语句如下所示:

代码语言:javascript
复制
alter table t_book add book_desc varchar2(20 char);

再次查看表t_book结构,如下图所示:

此时建表语句中的字段 book_desc varchar2(20 char) 指的是字符数。 示例如下:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上修行 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、MySQL 数据库
    • 以 MySQL 5.7 版本为例,数据库编码:utf8mb4
    • 2、Orcale 数据库
      • 以 Orcale 11g 版本为例,数据库编码:utf8
      • 3. 小结
      相关产品与服务
      云数据库 SQL Server
      腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档