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

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

时间:2023-12-25 13:46:28浏览次数: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://www.cnblogs.com/jinanxiaolaohu/p/17925923.html

相关文章

  • 达梦数据库varchar和nvarchar的验证
    达梦数据库varchar和nvarchar的验证测试SQLcreatetablespacezhaobshdatafile'/opt/dmdbms/data/DAMENG/zhaobsh.dbf'size128#需要注意达梦数据库的大小限制为:#第1行附近出现错误[-2422]:数据文件[/opt/dmdbms/data/DAMENG/zhaobsh.dbf]大小无效,取值范围为(128~671......
  • oracle中排序分析函数row_number()、rank()、dense_rank() 的区别
    row_number()产生的序号不会重复,即1、2、3...rank()产生的序号会重复,但是会跳号,出现1、2、2、4...的情况dense_rank()产生的序号会重复,不会跳号,会出现1、2、2、3的情况而普通的rownum是一个伪列,与你的orderby是没有关系的SELECTrow_number()over(ORDERBYac.check_number......
  • oracle安装
    1、创建系统和磁盘空间fdisk/dev/vdbpvcreate/dev/vdb1vgcreatedatavg/dev/vdb1lvcreate-noraclelv-L500G/dev/datavglvcreate-ndatalv-l100%Free/dev/datavgmkfs.ext4/dev/datavg/oraclelv添加交换分区fdisk/dev/vdc(82Linuxswap/So)mkswap/......
  • MYSQL varchar和nvarchar一些学习
    MYSQLvarchar和nvarchar一些学习背景先试用utfmb3的格式进行一下简单验证注意脚本都是一样的.createdatabasezhaobsh;usezhaobsh;createtablezhaobsh(zhaobshvarcharvarchar(30),zhaobshnvarcharnvarchar(30));insertintozhaobshvalues('123abc','1......
  • Oracle基础SQL整理:创建表空间、创建用户、赋予DBA权限、建表
    创建表空间CREATEtablespacefrdemodatafile'/tmp/frdemo.dbf'SIZE128mautoextendONNEXT100mmaxsize1024m;创建用户及绑定表空间CREATEUSERfruserIDENTIFIEDBYfinereportDEFAULTtablespacefrdemo;给用户赋予dba权限GRANTdbaTOfruser;创建表CREATETABLEt_o......
  • SQLServer的varchar与nvarchar的学习之二
    SQLServer的varchar与nvarchar的学习之二背景昨天简单总结了多种数据库varchar和nvarchar的区别与关系今天想着能够分析一下数据库文件.计划使用winhex查看数据文件,简单进行学习过程创建数据库和表,然后进行一些测试,进行简单测试判断.createdatabasezhaobshc......
  • Oracle编译无效对象
    问题描述:使用存储过程的方式对oracle数据库的无效对象,如视图或者同义词进行定期的编译,让他变成一个有效的对象,加上定时任务可以实现自动化的处理。同时在数据库内部创建一个记录表,用来记录被编译过的对象/*重新编译无效视图,无效同义词存储过程--1.创建无效对象监控表invalid_o......
  • 警示:AL32UTF8字符集不是ZHS16GBK字符集的超集
    今天有客户向我咨询:数据库由ZHS16GBK字符集修改为AL32UTF8字符集,发现中文的数据中小部分出现乱码,客户认为AL32UTF8明明可以支持更多的文字,不应该出现这样的情况才对。从现象看,基本可以确认故障是字符集转换导致的,Oracle也强烈不建议做这种字符集转换的操作,幸好该客户的操作只是在......
  • 凡是有但是-varchar和nvarchar的初步学习之一
    凡是有但是-varchar和nvarchar的初步学习之一背景高应用开发,在涉及到国内国外的问题时,重要的事情有两个:时区转换,字符集转换.时区转换虽然是很难理清楚,各种规范不统一的事情但是字符集转换更加扯淡.如果是一种数据库,一种字符集可能还好说现在面临的是多种数......
  • 通过 RMAN 备份 修复 Oracle 坏块的操作案例
    Oraclerman备份报错,提示数据文件有坏块,自己查看alert并无报错,说明还没有影响到业务。。根据报错检查确认[oracle@xx02~]$dbvfile='+DATAC1/xxxxdb/datafile/xx_tbs.3223.1044115207'blocksize=8192userid=sys/xxxxxxxDBVERIFY:Release11.2.0.4.0-ProductiononMonNo......