首页 > 数据库 >ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证

ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证

时间:2024-01-03 14:06:30浏览次数:34  
标签:00 varchar ZHS16GBK 61 赵赵 32 33 62 Oracle

ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证


背景

周末分析了 SQLServer mysql等数据库
想着继续分析一下oracle数据库
这边oracle使用的是ZHS16GBK的字符集.
所以比较特殊. 

还是建议得使用UTF-8字符集. 
能让系统干的活 就让系统干, 自己干国际化太费劲了.

处理思路

使用 123 1234 12345 进行分割字符信息进行确认

部分SQL

alter session set container=ora19cpdb ;
create tablespace zhaobsh datafile '/opt/oracle/oradata/ORA19C/ORA19CPDB/zhaobsh.dbf' size 1m ;
create user zhaobsh identified by Test20131127 default tablespace  zhaobsh ; 


sqlplus zhaobsh/[email protected]/ora19cpdb
测试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') ;
# 长度验证
insert into zhaobsh values ('1234567890123456789012345678901',N'1234567890123456789012345678901') ;
ASCII码 都是字节存储, 所以大小就是定义的 n 的数值。 
# 汉字验证
insert into zhaobsh values ('赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵',N'赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵') ;
varchar2 字段在GBK下面需要 除以 2
insert into zhaobsh values ('赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵',N'赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵赵') ;
nvarchar2 不需要除以 2  存储按照字符数进行存储

关于最大长度

之前总结过 oracle12c之前 ORACLE与SQLServer的varcahr和nvarchar都是 8000和 4000 的长度限制
但是在oracle12c 之后 oracle如果开启了一个 extended的模式后 
varchar的长度可以达到32k以上. 

但是需要注意 oracle12c 如果不开启参数, 也可以定义 varchar2(32000) 这样的大列了
但是如果不开启参数,会导致字符被截断

winhex的分析

先删除部分测试的数据 
然后copy出来文件.

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

0001FF60                                        31 32 33 34               1234
0001FF70   35 36 A3 BF A3 BF 61 62  63 64 65 66 1C 00 31 00   56??abcdef  1 
0001FF80   32 00 33 00 34 00 35 00  36 FF 1F FF 1F 00 61 00   2 3 4 5 6   a 
0001FF90   62 00 63 00 64 00 65 00  66 2C 01 02 0E 31 32 33   b c d e f,   123
0001FFA0   34 35 A3 BF A3 BF 61 62  63 64 65 18 00 31 00 32   45??abcde  1 2
0001FFB0   00 33 00 34 00 35 FF 1F  FF 1F 00 61 00 62 00 63    3 4 5   a b c
0001FFC0   00 64 00 65 2C 01 02 0A  31 32 33 34 D5 D4 61 62    d e,   1234赵ab
0001FFD0   63 64 12 00 31 00 32 00  33 00 34 8D 75 00 61 00   cd  1 2 3 4 u a 
0001FFE0   62 00 63 00 64 2C 01 02  06 31 32 33 61 62 63 0C   b c d,   123abc 
0001FFF0   00 31 00 32 00 33 00 61  00 62 00 63                1 2 3 a b c

ASCII分析

Oracle数据库应该是堆表
可以看到 ASCII的情况下
varchar2 是按照一个英文/数字一个字节进行存储的. 
nvarchar2 是按照两个字节一个汉字,英文, 数字进行存储的. 

06 31 32 33 61 62 63 
0C 00 31 00 32 00 33 00 61 00 62 00 63

这一点与SQLServer是一样的.

中文分析

0A 31 32 33 34 D5 D4 61 62 63 64 
12 0031 0032 0033 0034 8D 75 0061 0062 0063 0064

按照之前的分析: 
赵	简体中文(GB2312、GBK)	gb2312	D5D4
赵	Unicode	               utf-16  758D
赵	Unicode (Big-Endian)   utf-16BE	8D75

明显可以看出 varcahr2 时使用的GBK编码
nvarcahr时使用的是utf-16 或者是相类似的编码格式. 
并且大端和小端有一些区别

韩文分析

0E 31 32 33 34 35 A3 BF A3 BF 61 62 63 64 65
18 0031 0032 0033 0034 0035 FF 1F FF 1F 0061 0062 0063 0064 0065
捍卫直接都是乱码
只不过在varcahr里面显示的是 A3 BF
在nvarcahr里面显示的是     FF 1F

加N验证

0E 31 32 33 34 35 A3 BF A3 BF 61 62 63 64 65
18 0031 0032 0033 0034 0035 FF 1F FF 1F 0061 0062 0063 0064 0065

发现加不加N 在Oracle里面是完全一样的ZHS16GBK字符集不太兼容国际化

总结

Oracle的ZHS16GBK 感觉不如 SQLServer的CHINESE_PRC_CI_AS
国际化的处理比较差
但是存储汉字时 ORACLE的varcahr和nvarchar与 SQLServer的逻辑比较相似. 

开源的PG/MySQL/达梦 自成一派. 
都是按照unicode 的编码进行排列的, 其实varchar和nvarchar在这三种数据库中是一样的.



标签:00,varchar,ZHS16GBK,61,赵赵,32,33,62,Oracle
From: https://blog.51cto.com/u_11529070/9084316

相关文章

  • MYSQL varchar和nvarchar一些学习
    MYSQLvarchar和nvarchar一些学习背景先试用utfmb3的格式进行一下简单验证注意脚本都是一样的.createdatabasezhaobsh;usezhaobsh;createtablezhaobsh(zhaobshvarcharvarchar(30),zhaobshnvarcharnvarchar(30));insertintozhaobshvalues('123abc','123ab......
  • SQLServer的varchar与nvarchar的学习之二
    SQLServer的varchar与nvarchar的学习之二背景昨天简单总结了多种数据库varchar和nvarchar的区别与关系今天想着能够分析一下数据库文件.计划使用winhex查看数据文件,简单进行学习过程创建数据库和表,然后进行一些测试,进行简单测试判断.createdatabasezhaobshcreateta......
  • 凡是有但是-varchar和nvarchar的初步学习之一
    凡是有但是-varchar和nvarchar的初步学习之一背景高应用开发,在涉及到国内国外的问题时,重要的事情有两个:时区转换,字符集转换.时区转换虽然是很难理清楚,各种规范不统一的事情但是字符集转换更加扯淡.如果是一种数据库,一种字符集可能还好说现在面临的是多种数据库:......
  • oracle 9i&10g编程艺术-读书笔记1
    根据书中提供的下载代码链接地址,从github上找到源代码下载地址。https://github.com/apress下载好代码后,开始一段新的旅行。......
  • oracle和mysql在数据引擎上的本质区别
    Oracle和MySQL是两种不同的关系型数据库管理系统(RDBMS),它们在数据引擎上有一些本质区别。以下是它们之间的一些主要区别:开发商和许可协议:Oracle:由Oracle公司开发,采用商业许可协议。通常需要购买许可证,并且有较高的成本。MySQL:由Oracle公司的子公司MySQLAB开发,采用开源许可协议(通......
  • 从零开始学 Oracle 数据库 (001)
    学习目的从零开始学习Oracle数据库,达到OCP实操水平。学习计划目标用100天学习Oracle数据库,为记录学习过程,计划连更100天学习笔记。学习纲要这块先空着,佛系学习法,学到哪算哪,回头再总结。学习环境数据库版本OracleDatabase19cRelease(19.3.0.0.0-64-bit,1......
  • Oracle中查看隐含参数的sql
    selecta.ksppinm"Parameter",a.ksppdesc"Description",b.ksppstvl"SessionValue",c.ksppstvl"InstanceValue"fromx$ksppia,x$ksppcvb,x$ksppsvcwherea.indx=b.indxanda.indx=c.indxanda.ksppinmlike'%hb......
  • Oracle数据库统计信息_执行计划_sharedpool等的知识梳理
    Oracle数据库统计信息_执行计划_sharedpool等的知识梳理背景最近有项目出现了年底业务量增加时卡顿的情况.同事多次发现执行SQL缓慢.但是重新执行统计信息更新后问题就优化的现象.12月份上半月解决测试环境的SQLServer卡顿时基本上也是这个套路重建索引,添加必要索引的方......
  • Oracle19c on 银河麒麟的安装与升级
    Oracle19con银河麒麟的安装与升级下载内容preinstallCentOS8https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el8.x86_64.rpmpreinstallCentOS7https://yum.oracle.com/repo/OracleLinux/OL7/lates......
  • oracle11gR2表空间使用查询
    SELECTa.tablespace_name"表空间名称",100-ROUND((NVL(b.bytes_free,0)/a.bytes_alloc)*100,2)"占用率(%)",ROUND(a.bytes_alloc/1024/1024,2)"容量(M)",ROUND(NVL(b.bytes_free,0)/1024/1024,2)"空闲(M)",ROUND((a.bytes_alloc-NVL(b.byte......