ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证
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/Test20131127@127.0.0.1/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在这三种数据库中是一样的.
ZHS16GBK字符集下面Oracle数据库varchar与nvarchar的验证的更多相关文章
- Oracle中varchar,varchar2,nvarchar,nvarchar2的区别及其它数据类型描述
--varchar,varchar2 联系: 1.varchar/varchar2用于存储可变长度的字符串 比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个 ...
- Oracle中varchar,varchar2,nvarchar,nvarchar2的区别
--varchar,varchar2 联系:1.varchar/varchar2用于存储可变长度的字符串比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个字节 ...
- 【Linux】修改Linux操作系统字符集与Oracle数据库一致
#数据库中查看所使用字符集 SQL> select userenv('language') from dual; USERENV('LANGUAGE') -------------------- ...
- Oracle_字符集问题(数据库与客户端字符集关联关系)
http://blog.163.com/jiankun_liu/blog/static/1863927762013698175289 ********************************* ...
- 连接英文字符集的ORACLE和调用存储过程问题及64位服务器连接ORACLE问题
部署在IIS上的webservice连接英文字符集的ORACLE数据库出现问题“未在本地计算机上注册"MSDAORA.1"提供程序”,解决方案如下: 原因:如错误,64位系统未注册 ...
- 谨慎修改Oracle数据库字符集(UTF8<->ZHS16GBK)
Preface Today,I'm gonna say something what is related with the character set in Oracle datab ...
- 选择ORACLE数据库字符集
如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序.客户的本地环境.操作系统.服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系.另外对字符集的基本概 ...
- Oracle数据库字符集修改
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.一般来说,数据库字符集在安装数据库实例时就 ...
- 【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中
[exp/imp]将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后 ...
- Linux下修改Oracle数据库字符集命令
常见情形:从服务器备份Oracle数据库后再到本地机器上还原Oracle数据库的时候经常会碰见数据库字符编码不一致的情况,可以用以下命令来修改本地的Oracle数据库字符编码,然后顺利还原Oracle ...
随机推荐
- LLM增强LLM;通过预测上下文来提高文生图质量;Spikformer V2;同时执行刚性和非刚性编辑的通用图像编辑框架
文章首发于公众号:机器感知 LLM增强LLM:通过预测上下文来提高文生图质量:Spikformer V2:同时执行刚性和非刚性编辑的通用图像编辑框架 LLM Augmented LLMs: Expan ...
- manjaro下使用deepin-wine5解决wechat无法发送图片的问题
问题 在manjaro操作系统下,使用了deepin-wine安装wechat.但是,wechat运行无法发送较大图片且截图功能也有问题. 解决 在参考了github之后,我找到了解决方案. 附上链接 ...
- wpf 叫号系统
wpf 叫号系统 桌面版 wpf 叫号系统 C# .Net 4.8 WPF 数据库 SQLServer 2012 数据队列 Redis 日志 log4net 叫号系统客户端登陆 设置,职称设置,科室和 ...
- 车机必备软件-小白点EasyTouch(类似苹果的悬浮球,返回,清理垃圾,杀进程)
简介 有些小伙伴升级车机后,由于部分软件打开后处于全屏状态无法返回,这里我教大家如何解决.解决办法就是:在车机上安装这款小白点软件,这款软件体积小巧,不占内存,操作也十分方便,它能帮助你快速回到主屏幕 ...
- 质效提升 | 聊聊QA与业务测试
上面一篇文章<质效提升 | QA不做业务需求测试,你怎么看>主要讨论的是QA 和业务需求测试相关的问题,文章发出后收到了很多小伙伴的反馈,这里把很多有意义的反馈放在下面,希望对你有用. 约 ...
- 玩转云上数据湖,解析Serverless 技术落地
导读: 本文主要介绍Serverless计算相关技术与其在华为云数据湖探索服务(后文简称DLI)中的技术落地.Serverless是DLI将计算能力服务化和产品化关键技术,与传统IAAS和PAAS技术 ...
- 技术实践丨PostgreSQL开启Huge Page场景分析
PostgreSQL用户经常发现,服务端在连接数较大的情况下,会出现系统内存消耗过多的情况,严重者可能会造成OOM.但是服务端配置的共享内存(shared_buffers,wal_buffers等)是 ...
- 如何极速极速搭建个人博客?Copy攻城狮用的这一招很优秀!
摘要:在中国功夫中,"天下武功,无坚不摧,唯快不破",在编程的世界里,如何快速搭建一个属于自己的博客呢?那么 Pagic + Vercel 应该是个不错的选择!接下来,由Copy攻 ...
- 云图说丨每个成功的业务系统离不开API网关(APIG)的保驾护航
摘要:华为云API网关(APIG)是为企业开发者及合作伙伴提供的高性能.高可用.高安全的API托管服务, 帮助企业轻松构建.管理和部署不同规模的API. 本文分享自华为云社区<[云图说]第243 ...
- update 没有索引导致业务崩了,老板骂了一个小时
摘要:有天,一朋友在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩了,被老板教训了一波. 本文分享自华为云社区<update 没有索引,会锁全 ...