oracle 字符集总结(超出GBK范围的字符存取问题未解决)

您所在的位置:网站首页 oracle数据库支持的数据类型有哪些 oracle 字符集总结(超出GBK范围的字符存取问题未解决)

oracle 字符集总结(超出GBK范围的字符存取问题未解决)

2023-06-29 17:01| 来源: 网络整理| 查看: 265

字符集总结: 一、服务器的字符集(用来存储数据用的编码格式) 二、操作系统字符集(用来显示、解码/编码与oracle交互的编码格式) 三、oracle客户端字符集(用于转换操作系统、服务器端编码/解码格式问题)

 

后续在使用过程中领悟到: 最基础层是 数据库(创建库时的字符集) 第二层是:操作系统 第三层是:终端显示

保持三层为 相同字符集 既可,但要注意的是,必须以创建数据库时所使用的 字符集 为基准,进行设置 操作系统 、 终端的字符集,就基本没有问题;

 

引用一段话:

字符集,实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。Oracle的字符集命名遵循以下命名规则:   即:  。比如: AL32UTF8表示:AL,代表all,指使用所有语言;32,,32位;UTF8编码。查看环境变量发现:NLS_LANG=American_America.AL32UTF8,American表示语言;America表示地区;AL32UTF8字符集类型。

         AL32UTF8和UTF8有什么区别呢?Oracle的UTF8字符集由来已久,至少在8的时候就已经存在了,而对应的是UNICODE 3.0。而AL32UTF8字符集是9i才出现的,其对应的是UNICODE 5.0。这两种字符集的区别在于,UNICODE 5.0与3.0相比,又增加了一些新的补充字符。但是在实际当中,使用到这些新增字符的可能性非常小,因此绝大部分情况下,选择UTF8也是足够的。AL32UTF8字符集是9i才出现的,那么对于9i以后的版本访问没有任何问题,但是对于8i及以前的版本,则不认识这个字符集。这就使得8i及更低版本的客户端在访问9i以上AL32UTF8的数据库时,会碰到各种各样的问题。因此,如果数据库版本都在9i及其以上,不需要考虑ORACLE8的数据库,建议使用AL32UTF8字符集,它采用的Unicode标准要比UTF8采用的Unicode标准更新,支持的字符也更多一些。如果要考虑ORACLE8数据库,建议使用UTF8字符集,它的兼容性好,在ORACLE8及8I数据库上使用AL32UTF8字符集容易出现问题。随着现在版本11g逐渐开始称为主流版本,8i客户端的情况已经越来越少见了,因此在11.2的DBCA中,UTF8已经不是推荐字符集列表中的一员了。我们在遇到不兼容的问题时就要修改字符集。

 

一、服务器的字符集(用来存储数据用的编码格式)     编码字符集包含关系:ZHS32GB18030 > ZHS16GBK > ZHS16CGB231280 参考文章:http://docs.oracle.com/cd/B10501_01/server.920/a96529/appa.htm#956722 oracle 支持的字符集:     在 oracle 官方文档中提到支持以下中文字符集:          ZHS16CGB231280  CGB2312-80 16-bit Simplified Chinese  -- 11g 已不支持          ZHS16GBK        GBK 16-bit Simplified Chinese          ZHS32GB18030    GB18030-2000                          -- 11g 已不支持          ZHT16BIG5       BIG5 16-bit Traditional Chinese       -- 11g 已不支持          ZHT32EUC        EUC 32-bit Traditional Chinese          ZHT16HKSCS      MS Windows Code Page 950 with Hong Kong Supplementary Character Set          ZHT16MSWIN950   MS Windows Code Page 950 Traditional Chinese     而我在11g创建 DB 时,选项中只支持以下几种中文字符集:          ZHS16GBK        GBK 16-bit Simplified Chinese    -- 我们中国大陆只能选它了...          ZHT16HKSCS      MS Windows Code Page 950 with Hong Kong Supplementary Character Set          ZHT16MSWIN950   MS Windows Code Page 950 Traditional Chinese          ZHT32EUC        EUC 32-bit Traditional Chinese          AL32UTF8        Unicode 4.0 UTF-8 Universal character set    --  实验时,使用的是字符集,证明可以存储 ZHS16GBK 以外的字符集  

二、操作系统字符集(用来显示、解码/编码与oracle交互的编码格式)     linux命令下:        locale -a                -- 查看操作系统支持哪些字符集;        locale charmap           -- 看操作系统的字符解码是哪种方式;        export LANG=zh_CN.UTF-8  -- 设置操作系统 为 中文,utf8编码方式

三、oracle客户端字符集(用于转换操作系统、服务器端编码/解码格式问题)     linux命令下:     export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'  -- 设置 语言:简体中文   区域:中国  编码:utf8

实验: 测试字符(以下字符都不在GBK字符范围内):

一、 gbk字符集的情况下   条件:         服务器端oracle的字符集:ZHS16GBK         linux终端环境变量设置 LANG:export LANG="zh_CN.GB18030"         linux终端环境变量设置 NLS_LANG: export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS32GB18030"           CREATE TABLE TST_CHARACTER   (     F1 NVARCHAR2(8)   );        结果:    一、sqlplus中试验      1.  INSERT INTO TST_CHARACTER values('');  -- 成功

         select * from TST_CHARACTER ;            -- 失败,乱码;             F1             --------------------------------             ??          select * from TST_CHARACTER where F1=''  -- 查询成功,但是乱码;

   二、P/L SQL Developer 8.0 版本试验

    1. select * from TST_CHARACTER for update;    -- 使用把拷贝进去,成功显示, 但是不能使用where 条件查询;        select * from TST_CHARACTER where F1=''  -- 查询不成功;        select * from TST_CHARACTER                -- 能显示 '' 字        二、 AL32UTF8 字符集的情况下   条件:         服务器端oracle的字符集: AL32UTF8         linux终端环境变量设置 LANG:export LANG="zh_CN.UTF-8"         linux终端环境变量设置 NLS_LANG: export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'           CREATE TABLE TST_CHARACTER   (     F1 NVARCHAR2(8)   );      结果:    一、sqlplus中试验    SQL> INSERT INTO TST_CHARACTER values('');  -- 成功    SQL> select * from tst_character;             -- 失败,乱码;        F1    --------------------------------    ��    SQL> select * from TST_CHARACTER where F1='' ;  -- 成功,但显示为乱码;        二、P/L SQL Developer 8.0 版本试验     INSERT INTO TST_CHARACTER values('') ;     -- 成功     commit;     select * from TST_CHARACTER   -- 失败,乱码;     select * from TST_CHARACTER  where F1='' for update;   -- 成功找到数据,但显示为乱码;    

直到现在,还没有找到一种方法可以正确存入,并能条件查询,并正确反显的。。。。。。。。。 有时间再搞,得睡了。。。。。

 

以上如果有哪位大虾能帮解决一下么,谢谢啦 ~!~

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3