MySQL数据库与Oracle数据库在存储中文字符以字节或字符存储的区别

一、Oracle数据库存储中文字符

 Oracle数据库可以以字节或者字符来存储字符串的,一般来说默认是存储字节,你可以查看数据库NLS_LENGTH_SEMANTICS的值。

可以看到Oracle数据库,默认以字节形式存储字符串。

当以默认形式,即以字节为单位存储字符串的时候,建表语句中char或varchar2只用传入长度即可,不用输byte

例如:

CREATE TABLE varchar2_test(name varchar2(3),id number);
INSERT INTO varchar2_test(name,id)VALUES('小蜜蜂',1);
COMMIT;

根据建表语句,name字段可以存储3个字节空间的字符串,根据不同的编码格式,存储的字符串有差异,具体如下

一个汉字占多少长度与编码有关:

  • UTF-8:一个汉字 = 3个字节,英文一个字母占用一个字节
  • GBK: 一个汉字 = 2个字节,英文一个字母占用一个字节

所以这里的name字段,只能存储一个汉字,但是插入了name字段的值为3个汉字,这里数据库在插入数据时会报错。

提示name字段最大是3字节,但是实际上存储了9字节,这就是因为数据库服务器的编码用的al32utf-8,一个汉字占用3个字节。

如果想要建表时候,里面传入的长度就是具体的字符个数,可以这样写:

CREATE TABLE varchar2_test2(name varchar2(3 CHAR),id number);
insert into varchar2_test2(name,id)values('小蜜蜂',1);

这就表示name字段可以传入3个字符串(中英文3个字符串)

现在这条插入语句,就不会报错了

同样这也适用char类型或varchar类型的数据类型。

下边用查询语句分别查询一下字段长度:

可以使用lengthb查看字符占用的字节长度

可以用length查看字符长度

可以使用vsize查询存储中文字符需要的字节空间

下边来修改数据库编码格式为gbk

具体操作步骤如下:

详细步骤,可以参考:oracle查看编码以及修改编码

现在查询一下编码:

发现已经修改成了ZHS16GBK

现在再查询一下,GBK编码下,中文字符所占字节

可以看到‘你’占用2个字节

存储‘小蜜蜂’需要6个字节空间

演示完毕,现在再改回原来的AL32UTF8编码格式

将上边的过程再操作一遍,改回原来的编码格式,然后再查询

二、MySQL存储中文字符

4.0版本以下,varchar(10),默认是以字节存储,表示可以存储10个字节的字符串。 

5.0版本以上,varchar(10),指的是可以存储的字符数。5.0版本及以上,默认是以字符存储。

电脑上安装的是5.x版本,下边以这个版本(5.7.12)为演示数据库

查询一下mysql数据库的编码格式:

创建数据表:

show databases;
use test1;
create table varchar_test(name varchar(5),id int primary key auto_increment);
insert into varchar_test(name,id) values('小蜜蜂是个初级程序');

运行插入语句,发现会报错,建表的时候,name字段最大可以输入5个字符,但是插入语句中name字段赋值了9个字符,提示数据太长

现在修改一下:

现在可以成功插入数据了

接下来查询一下中文字符长度和占用的字节:

因为使用的是utf-8编码,中文字符占用3个字节,所以name=‘小蜜蜂是个’占用15个字节

而字符长度是5

接下来再测试一下数字型字符串

可以看到一个单个的数字字符也是占用一个字节,和英文字母一样

注意事项:

关于utf8mb4

在MySql 5.5 之前,UTF8 编码最多支持3个字节,只支持BMP部分的unicode编码区,BMP是从哪到哪?戳这里 基本就是 0000 ~ FFFF 这一区。

从MySQL 5.5 开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。
utf8mb4 is a superset of utf8

tf8mb4兼容utf8,且比utf8能表示更多的字符。

至于什么时候用,看你做的什么项目了。。。
在做移动应用时,会遇到ios用户在文本的区域输入emoji表情,如果不做一定处理,就会导致插入数据库异常。

发布了74 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u011174699/article/details/100049494