一、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
表情,如果不做一定处理,就会导致插入数据库异常。