神通数据库的varchar和nvarchar的验证
登录神通数据库
isql
注意 神通数据库的默认密码是 szoscar55
Welcome to isql 2.0.56 interactive terminal, Client Default Encoding is UTF8.
Login time:2023-12-25 16:00:36
Password for default user:
Connect to:
神通数据库7.0.8.191204 for Linux(x86 64bit) (65535 connections) (license invalid after 74 days)
Using New Protocol. Database Encoding is GB18030.
Type: 'copyright' for distribution terms
'help' or '\h' for help with SQL commands
';' for end with commands
'!' to run system commands
'@' to run sql script
'exit' for quit
SQL=>
创建数据库相关
create tablespace zhaobsh datafile '/opt/ShenTong/odbs/OSRDB/zhaobsh.dbf' ;
create user zhaobsh with password 'Testxxxxxx' default tablespace zhaobsh role sysdba;
isql -Uzhaobsh 重新登录数据库:
执行SQL:
create table zhaobsh ( zhaobshvarchar varchar2(30), zhaobshnvarchar nvarchar2(30) ) ;
insert into zhaobsh values ('123abc','123abc') ;
insert into zhaobsh values ('1234赵abcd','1234赵abcd') ;
insert into zhaobsh values ('12345한국abcde','12345한국abcde') ;
insert into zhaobsh values ('123456한국abcdef',N'123456한국abcdef') ;
WINHEX解析
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F
00025F70 31 32 33 34 1234
00025F80 35 36 83 36 84 33 82 37 F4 30 61 62 63 64 65 66 56????abcdef
00025F90 31 32 33 34 35 36 83 36 84 33 82 37 F4 30 61 62 123456????ab
00025FA0 63 64 65 66 2A 00 02 00 24 12 00 00 31 32 33 34 cdef* $ 1234
00025FB0 35 83 36 84 33 82 37 F4 30 61 62 63 64 65 31 32 5????abcde12
00025FC0 33 34 35 83 36 84 33 82 37 F4 30 61 62 63 64 65 345????abcde
00025FD0 1A 00 02 00 14 0A 00 00 31 32 33 34 D5 D4 61 62 1234赵ab
00025FE0 63 64 31 32 33 34 D5 D4 61 62 63 64 12 00 02 00 cd1234赵abcd
00025FF0 0C 06 00 00 31 32 33 61 62 63 31 32 33 61 62 63 123abc123abc
ASCII
varchar: 31 32 33 61 62 63
nvarchar: 31 32 33 61 62 63
与PG数据库一样, 虽然是GB18030的字符集 但是实际上还是存储的单字节的英文和数字.
中文
varchar: 31 32 33 34 D5 D4 61 62 63 64
nvarchar: 31 32 33 34 D5 D4 61 62 63 64
与达梦数据库保持一致:
在中文的表现看来. varchar和nvarchar 其实是一直的
都是展示的 赵的 GBK的编码
赵 简体中文(GB2312、GBK) gb2312 D5D4
需要注意 GB18030 和 GBK应该是兼容的:
赵 简体中文(GB18030) GB18030 D5D4
说明 varchar 和 nvarchar 都是 ASCII 占用一个字节, 中文占用两个字节.
韩文
varchar: 31 32 33 34 35 83 36 84 33 82 37 F4 30 61 62 63 64 65
nvarchar: 31 32 33 34 35 83 36 84 33 82 37 F4 30 61 62 63 64 65
跟达梦数据库也是一样的
注意他存储的是:
한국 简体中文(GB18030) GB18030 83 36 84 33 82 37 F4 30
因为我选择的是 GB18030的数据库字符集 所以韩文明显存储的就是 GB18030的信息
需要说明的是
韩文是 四字节的 编码.
所以 两个韩文其实使用了 8个字节进行存储
同事也说明.
不管是varchar 和 nvarchar 在进行 韩文的存储时也是一样的.
增加 N 的处理结果
varchar: 31 32 33 34 35 36 83 36 84 33 82 37 F4 30 61 62 63 64 65 66
nvarchar: 31 32 33 34 35 36 83 36 84 33 82 37 F4 30 61 62 63 64 65 66
与达梦数据库同字符集下面的表现也是一样的.
加不加没什么问题, 区别就是汉字作为双字节存储, 韩文是四字节存储. 英文数字是单字节存储.
长度限制验证
create table zhaobsh2 ( zhaobshvarchar varchar2(10), zhaobshnvarchar nvarchar2(10) ) ;
insert into zhaobsh2 values ('1234567890','1234567890') ;
正常插入
insert into zhaobsh2 values ('1234567890','12345678901') ;
insert into zhaobsh2 values ('123456789o1','123456789o') ;
上面两句都报错:
ERROR, 字符串溢出, value too long for type character varying(10)
insert into zhaobsh2 values ('赵赵赵赵赵赵赵赵赵赵','赵赵赵赵赵赵赵赵赵赵') ;
正常插入
insert into zhaobsh2 values ('赵赵赵赵赵赵赵赵赵赵','赵赵赵赵赵赵赵赵赵赵济') ;
insert into zhaobsh2 values ('赵赵赵赵赵赵赵赵赵赵济','赵赵赵赵赵赵赵赵赵赵') ;
上面两句都报错:
ERROR, 字符串溢出, value too long for type character varying(10)
insert into zhaobsh2 values ('한국한국한국한국한국','한국한국한국한국한국') ;
正常插入
insert into zhaobsh2 values ('한국한국한국한국한국국','한국한국한국한국한국') ;
insert into zhaobsh2 values ('한국한국한국한국한국','한국한국한국한국한국국') ;
上面两句都报错:
ERROR, 字符串溢出, value too long for type character varying(10)
总结
在GB18030的字符集下面
varchar和nvarcahr 存储 中文 韩语 英文和数字是没有区别的 都是按照GB18030的编码进行填充.
这一点与达梦一致.
PG和MySQL存储的是UTF-8编码.
ORACLE会乱码 SQLSERVER nvarchar 会存储unicode字符集的码字
关于字符长度
达梦 oracle sqlserver varcahr 是字节数
其他数据库 varcahr和nvarchar保持一致都是 字符数.
感觉好不统一.