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的验证的更多相关文章

  1. Oracle中varchar,varchar2,nvarchar,nvarchar2的区别及其它数据类型描述

    --varchar,varchar2 联系: 1.varchar/varchar2用于存储可变长度的字符串 比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个 ...

  2. Oracle中varchar,varchar2,nvarchar,nvarchar2的区别

    --varchar,varchar2 联系:1.varchar/varchar2用于存储可变长度的字符串比如varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个字节 ...

  3. 【Linux】修改Linux操作系统字符集与Oracle数据库一致

    #数据库中查看所使用字符集 SQL> select userenv('language') from dual; USERENV('LANGUAGE') -------------------- ...

  4. Oracle_字符集问题(数据库与客户端字符集关联关系)

    http://blog.163.com/jiankun_liu/blog/static/1863927762013698175289 ********************************* ...

  5. 连接英文字符集的ORACLE和调用存储过程问题及64位服务器连接ORACLE问题

    部署在IIS上的webservice连接英文字符集的ORACLE数据库出现问题“未在本地计算机上注册"MSDAORA.1"提供程序”,解决方案如下: 原因:如错误,64位系统未注册 ...

  6. 谨慎修改Oracle数据库字符集(UTF8<->ZHS16GBK)

      Preface       Today,I'm gonna say something what is related with the character set in Oracle datab ...

  7. 选择ORACLE数据库字符集

    如何选择数据库的字符集是一个有争议的话题,字符集本身涉及的范围很广,它与应用程序.客户的本地环境.操作系统.服务器等关系很密切,因此要做出合适的 选择,需要明白这些因素之间的关系.另外对字符集的基本概 ...

  8. Oracle数据库字符集修改

    Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.一般来说,数据库字符集在安装数据库实例时就 ...

  9. 【exp/imp】将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中

    [exp/imp]将US7ASCII字符集的dmp文件导入到ZHS16GBK字符集的数据库中 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后 ...

  10. Linux下修改Oracle数据库字符集命令

    常见情形:从服务器备份Oracle数据库后再到本地机器上还原Oracle数据库的时候经常会碰见数据库字符编码不一致的情况,可以用以下命令来修改本地的Oracle数据库字符编码,然后顺利还原Oracle ...

随机推荐

  1. buuctf 加固题 babypython WriteUp

    原题wp参考链接:https://www.cnblogs.com/karsa/p/13529769.html 这是CISCN2021 总决赛的题,解题思路是软链接zip 读取文件,然后伪造admin的 ...

  2. pacman下载时经常出现Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds

    问题 我在manjaro系统上使用pacman下载软件的时候,经常出现以下报错: 错误:无法从 mirrors.tuna.tsinghua.edu.cn : Operation too slow. L ...

  3. RSA 加密算法

    RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用.RSA是由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Ad ...

  4. CSS3学习笔记-句子排版效果

    CSS3提供了丰富的排版效果,可以通过样式属性来控制文本的排列方式.字体样式.行高.字间距等.以下是一些常用的句子排版效果示例: 文本对齐方式: .text-center { text-align: ...

  5. 为什么浏览器会提示网站“不安全”?一文读懂https协议与SSL证书

    [摘要] 为什么浏览器会提示网站"不安全"?从浏览器的"不安全"提示来详细了解https与SSL证书.我们打开很多http网站时候,会看到浏览器提示" ...

  6. 《华为云DTSE》期刊2023年第二季—HDC.Cloud 2023专刊

    本文分享自华为云社区<<华为云DTSE>期刊2023年第二季-HDC.Cloud 2023专刊>,作者: HuaweiCloudDeveloper . AI技术风起云涌,百家争 ...

  7. 解析Stream foreach源码

    摘要:串行流比较简单,对于parallelStream,站在它背后的是ForkJoin框架. 本文分享自华为云社区<深入理解Stream之foreach源码解析>,作者:李哥技术 . 前言 ...

  8. #2037:今年暑假不AC

    Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" & ...

  9. Codeforces Round #617 (Div. 3) A~E

    比赛链接:Here 1296A. Array with Odd Sum 题意:给了 \(n\) 个数,现在就是说可以选择两个数让其中一个的值等于另一个的值. 这种操作无限次 问是不是能让这n个数操作后 ...

  10. POJ 1456 Supermarket【贪心 + 并查集】

    http://poj.org/problem?id=1456 题意:给你 N 件不同的商品,每件商品最多可以买一次.每件物品对应两个值 pi di pi 表示物品的价值,di 表示可以买的最迟时间(也 ...