1 字符集超集 当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。

Oracle有子集-超级对照表(subset-superset pairs),例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。

2 国家字符集(National character set)

国家字符集用以存储NCHAR, NVARCHAR2, NCLOB等类型数据,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AL16UTF16。

3 数据库字符集(national character set)

Oracle中个,如下三个场景,需要使用到数据库字符集。

●存储CHAR, VARCHAR2, CLOB, and LONG类型的数据

●识别表名、列名、PL/SQL变量等

●输入和存储SQL和PL/SQL源码

由于字符集需要用来识别SQL和PL/SQL代码,所以oracle的字符集必须是ASCII或EBCDIC【EBCDIC是为IBM推出的字元编码表,地位与ASCII对应】的超集。所以Oracle字符集不能使多字节定长编码字符集,例如AL16UTF16【AL16UTF16是定长2字节编码】。在不考虑EBCDIC情况下,Oracle的字符集一定是ASCII的超集,比如字符'a'在ASCII中的编码是0x61,在数据库字符集中的编码也要是0x61。

4 Oracle中的字符集格式和常见的字符集

oracle中字符集的命名格式:

[S|C]

region: zhs表示中文简体,zht表示中文繁体,us美国英语,we表示西欧语言,eg表示英语.

最后一个字段:S 只对server有效;C表示只对client有效。

oracle中常见的字符集名称格式

Oracle Character Set Name

Description

Region

Number of Bits Used to Represent a Character

Standard Character Set Name

US7ASCII

SB, ASCII

US

7

ASCII

WE8ISO8859P1

SB, ASCII

WE (Western Europe)

8

ISO8859 Part 1

ZHS16GBK

MB, ASCII,UDC

中国大陆(中文简体)

16

GBK

ZHT16BIG5

MB, ASCII

台湾

16

BIG5

AL32UTF8

MB,ASCII,EURO

UTF-8

ZHS16CGB231280

MB,ASCII

中国大陆(中文简体)

16

GB231280

Unicode字符集

Name

Description

Comments

AL16UTF16

Unicode 4.0 UTF-16 Universal character set

定长,2个字节编码(疑问:UTF-16可能占用2byte,也可能占用4byte,在oracle中为什么是定长的?)。只能作为国家字符集码

MB, EURO, FIXED

AL32UTF8

Unicode 4.0 UTF-8 Universal character set

MB, ASCII, EURO

UTF8

Unicode 3.0 UTF-8 Universal character set, CESU-8 compliant

MB, ASCII, EURO

UTFE

EBCDIC form of Unicode 3.0 UTF-8 Universal character set (UTF-EBCDIC)

MB, EURO

表中的简写

SB: single-byte encoding 单字节编码

MB: multibyte encoding 多字节编码

FIXED: fixed-width multibyte encoding 定长编码

ASCII: strict superset of ASCII ASCII的超集

EURO: euro symbol supported 支持欧元符号

UDC: user-defined characters supported 支持用户自定义的字符

AL32UTF8与UTF8区别:

AL32UTF8对应Unicode4.0,UTF8对应Unicode3.0。Unicode4.0在Unicode3.0基础上增加了一些字符,但是在实际当中,使用到这些新增字符的可能性非常小,因此绝大部分情况下,选择UTF8也是足够的。

而对于数据库的访问而言,二者还是存在一定差异的。前面提到了AL32UTF8字符集是9i才出现的,那么对于9i以后的版本访问没有任何问题,但是对于8i及以前的版本,则不认识这个字符集。这就使得8i及更低版本的客户端在访问9i以上AL32UTF8的数据库时,会碰到各种各样的问题。因此,Oracle建议在选择AL32UTF8和UTF8字符集时,最关键的一点就是是否有8i及以下版本的客户端会登录到数据库中,如果没有则可以选择AL32UTF8,如果存在这种客户端,那么需要选择UTF8字符集。

5 长度的语义

--最多存储10个字节的数据

VARCHAR2(10 BYTE)

--最多存储10个字符,存储可能超过10个字节。

VARCHAR2(10 CHAR)

--取决于参数NLS_LENGTH_SEMANTICS,如果值为BYTE ,语句与VARCHAR2(10 BYTE)等价;如果值为CHAR,则语句与VARCHAR2(10 CHAR)等价

VARCHAR2(10)

建议使用ORACLENLS_LENGTH_SEMANTICS指定的语义,避免相同数据库出现不同的长度语义。

6 数据库字符集转换

如果oracle客户端和服务端的字符集不同,Oracle Net会自动在两者之间进行转换,转换对用户是透明的。例如:'你'的GBK编码是0xc4e3,UTF8编码是0xe4bda0,我们假设服务端字符集是AL32UTF8,客户端的字符集是ZHS16GBK, 客户端向类型为varchar2的类写入'你',则Oracle net收到的数据是oxc4a3,Oracle Net检测到客户端和服务端的字符集不同,于是发生转换,最终写入dbf文件的是数据0xe4bda0。可以通过dump函数来验证。

字符集转换有如下两个缺点:

●可能造成数据的改变

只要其中的一个字符集不能对另外一个字符集的某个字符不能编码时,就可能出现有损转换,即数据被改变。注意,有损转换在读数据和写数据都有可能发生。

●影响服务端的性能

为了避免数据的改变,服务端的字符集【记为A】 必须 覆盖 其所有客户端的字符集【记为B】,即A必须对B中每个字符都能够编码。A为WE8ISO8859P1,B为S7ASCII,符合要求。反之,A为US7ASCII,B为WE8ISO8859P1不符合要求,比如客户端写字符"'?',由于ASCII无法表示这个字符,OracleNet把这个字符转化为'?'。

注:在Oracle官网指明服务端的字符集一定要是客户端字符集的超集,我认为是不对的。我认为服务端的字符集能够对客户端的每个字符都能编码即可。也有可能我对oracle文档中的supserset理解有误。

图 字符集转换出现异常的例子,由于US7ASCII不能对

WE8MSWIN1252中的每个字符进行编码,所以可能出现有损转换

图 字符集不会出现异常的例子,前提是客户端只读取自己提交

的数据,如French Client读取 Japanese Client(JA16EUC)的

数据,也可能出现数据的有损转换。

Oracle建议客户端和服务端的字符集最好保持一致。

7 数据库字符集选取

oracle强烈建议使用Unicode字符集,因为Unicode字符集提供很好的可用性、兼容性、可扩张性。

8 服务端字符集的查看和修改

●修改

在不重建数据库的条件下,数据库字符集在数据库创建后原则上不能更改。只有一个例外:只有新的字符集是当前字符集的严格超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用如下语句。

alter database character set utf8;

●查看

通过视图v$nls_parameters可以查看字符集。其中NLS_CHARACTERSET表示数据库字符集,NLS_NCHAR_CHARACTERSET表示国家字符集。

select * from v$nls_parameters;

select userenv('language') from dual;

9 客户端字符集的设置

客户端字符集是通过设置NLS_LANG参数来设定的。 NLS_LANG参数格式如下:

NLS_LANG = LANGUAGE_TERRITORY.CHARACTER_SET

Parameter

Description

LANGUAGE

显示oracle消息,校验,日期命名

TERRITORY

指定默认日期、数字、货币等格式

CHARACTER_SET

指定客户端将使用的字符集

例如:

NLS_LANG=AMERICAN_AMERICA.US7ASCII

AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集

NLS_LANG常见的值:

Chinese

(PRC)

SIMPLIFIED CHINESE_CHINA.ZHS16GBK

Chinese

(Taiwan)

TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950

English

(United Kingdom)

ENGLISH_UNITED KINGDOM.WE8MSWIN1252

English

(United States)

AMERICAN_AMERICA.WE8MSWIN1252

Japanese

JAPANESE_JAPAN.JA16SJIS

客户端字符集设置主要方法

●UNIX环境

$NLS_LANG="simplified chinese"_china.zhs16gbk

$export NLS_LANG

编辑oracle用户的profile文件

●Windows环境

编辑注册表

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID\NLS_LANG

客户端修改字符集的方法

●修改环境变量NLS_LANG

●使用ALTER SESSION语句,在oracle会话中修改

●使用某些SQL函数

优先级是:Sql function > alter session > NLS_LANG

oracle subset-superset pairs,Oracle 字符集相关推荐

  1. oracle查看编码格式以及修改字符集编码

    oracle查看编码格式以及修改字符集编码 查看oracle数据库的编码集     客户端字符集环境select   *   from   nls_instance_parameter,其来源于v$p ...

  2. linux7.0安装oracle乱码,Oracle Linux 7设置中文字符集

    常安装Linux系统本着最简化安装,会默认使用英文字符集,不会安装中文字符集等其他字符.但是在一些必要情况下需要中文的支持,本文将演示如何在Oracle Linux7在安装中文字符集 1.首先使用lo ...

  3. oracle 查询字符代码dump,字符集问题(Linux、oracle、终端等,导入导出数据)

    locale的设定及其LANG.LC_ALL.LANGUAGE环境变量的区别 例如zh_CN.GB2312.zh_CN.GB18030或者zh_CN.UTF-8.很多人都不明白这些古里古怪的表达方式. ...

  4. oracle 强制 断开,ORA-01092: ORACLE 例程终止 强行断开连接

    今天测试部门的人叫我过去,说是数据库当了,起不来了. 我过去看了看情况,做了如下操作 SQL> shutdown immediate 数据库已经关闭. 已经卸载数据库. Oracle 例程已经关 ...

  5. oracle 输出重复记录,ORACLE 去除重复记录

    ORACLE 去除重复记录 delete from tbl_talbe where (col1,col2,col3) in (select col1,col2,col3 from tbl_table ...

  6. 数据如何导入oracle数据库,如何用Oracle导入导出工具来实现Oracle数据库移植?

    Oracle数据库作为目前市场的主流数据库之一,许多应用都在其上进行开发,由于Oracle数据库更新换代的原因和不同的应用程序提供商,可能会造成在一个单位的应用中存在Oracle的几种版本,如Orac ...

  7. oracle 9i aix 迁移,Oracle 9i 在AIX上的安装 (转)

    ■可以删除原有的.cpio文件腾出剩余的空间 2.检查要求 检查附录1的表格系统要求的内容 3.预安装 ■完成安装任务 □以Root用户登录 □建立目录/oracle,此目录下至少有3G以上的空间,见 ...

  8. oracle 11g重新安装配置,Oracle 11g数据库安装和卸载教程

    Oracle11g的安装教程 同时解压缩两个zip文件,生成一个database文件夹,进入到database文件夹,点击setup 去掉安全更新的选项,直接下一步 选择创建和配置数据库,点击下一步 ...

  9. 不安装oracle 连接数据库,不安装oracle 连接服务器oracle数据库方法

    1:http://eduunix.ccut.edu.cn/index2/database/Oracle%20Instant%20Client/   下载你需要的Oracle Instant Clien ...

最新文章

  1. Vista OS 中添加网络中的非Vista OS共享的打印机
  2. [转载] 七龙珠第一部——第091话 克林反败为胜
  3. mysql 创建和删除用户
  4. 获取进程号并赋值判断进程状态
  5. 如何解决浏览器缩小出现横向滚动条时网页背景图出现空白的问题
  6. 简单的面试题简解思路(搜集)
  7. UI设计素材模板|游戏APP界面
  8. 服务器关掉后django项目停止,Django项目关闭debug模式后,静态文件无法加载的解决办法...
  9. 怎么解决tomcat端口占用问题?
  10. R语言学习资料分享下载
  11. html子级透明度不随父级别,我不想从CSS的父级继承子级不透明度
  12. java多线程-慎重使用volatile关键字
  13. LeetCode刷题——209. 长度最小的子数组
  14. sga_target大于sga_max_size数据库无法启动
  15. AFNetWorking网络库教程
  16. python while循环语句
  17. 全国计算机一级成绩分配,计算机一级ms分值分配
  18. 【Linux】磁盘类型设备驱动介绍
  19. TextView 的各种max 及maxEms是什么意思
  20. 蓝桥杯 算法训练 关联矩阵Python实现

热门文章

  1. laravel 知识点总结
  2. 【Java】多线程编程
  3. Linux之date命
  4. pycharm搭建spark环境
  5. 一起来学jquery!
  6. 【工具】CodeSmith Generator 7.0.2激活步骤
  7. linux分布式安装hadoop1.2
  8. mysql和redis之间互相备份
  9. POJ 1095 Trees Made to Order
  10. SpringSession+redis解决分布式session不一致性问题