UTF8 和 AL32UTF8 的区别

 概述

    ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储、处理和检索数据。利用全球化支持,ORACLE为用户提供自己熟悉的数据库母语环境,诸如日期格式、数字格式和存储序列等。Oracle可以支持多种语言及字符集,其中oracle8i支持48种语言、76个国家地域、229种字符集,而oracle9i则支持57种语言、88个国家地域、235种字符集。由于oracle字符集种类多,且在存储、检索、迁移oracle数据时多个环节与字符集的设置密切相关,因此在实际的应用中,数据库开发和管理人员经常会遇到有关oracle字符集方面的问题。

      字符集,实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。Oracle的字符集命名遵循以下命名规则:<Language><bitsize><encoding> 即: <语言><比特位数><编码> 。比如: 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已经不是推荐字符集列表中的一员了。我们在遇到不兼容的问题时就要修改字符集。

 

      UTF8 和 AL32UTF8 是 Unicode 字符集的编码,包括所有现代语言的所有字符。UTF8 和 AL32UTF8 允许使用受支持语言的任意组合从一个数据库实例运行 Oracle 应用程序。AL32UTF8 相对于 UTF8 的优势在于对增补字符的处理,增补字符在某些语言中的使用越来越多。AL16UTF16 是 Oracle 数据库 10g 和 11g 以及 Oracle E-Business Suite R12 的当前默认数据库字符集。

    如果您碰巧创建了一个新的 Apps Production 实例,请确保选择字符集为 AL16UTF16,前提是连接到您的实例的所有客户端和服务器都是 9i 及更高版本。这是因为根据 metalink 注释 237593.1,8i 数据库无法连接到 AL32UTF8 数据库

警告:

  • AL32UTF8是适用于 XMLType 数据的 Oracle 数据库字符集。相当于IANA注册的标准UTF-8编码,支持所有有效的XML字符。
  • 不要将 Oracle 数据库数据库字符集 UTF8(无连字符)与数据库字符集 AL32UTF8 或字符编码 UTF-8 混淆。数据库字符集 UTF8 已被 AL32UTF8 取代。不要将 UTF8 用于 XML 数据。UTF8 仅支持 Unicode 3.1 及更早版本;它不支持所有有效的 XML 字符。AL32UTF8 没有这样的限制。
  • 对 XML 数据使用数据库字符集 UTF8 可能会导致致命错误或对安全性产生负面影响。如果数据库字符集不支持的字符出现在输入文档元素名称中,则替换字符(通常是问号)将替换它。这将终止解析并引发异常。

 

解决方案

AL32UTF8-->UTF8修改字符集的步骤

shutdown immediate; //关闭数据库服务器
startup mount;
alter session set sql_trace=true;
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
alter database open;
alter database character set internal_use utf8;
alter session set sql_trace=false;
shutdown immediate;
startup;

配置案例过程

下面是别人的一个实例:

#su - oracle

$sqlplus "/ as sysdba"

SQL*Plus: Release11.2.0.3.0 Production on Wed Apr 18 14:40:10 2012
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

SQL>

修改之前的字符集
SQL> select * fromv$nls_parameters where parameter='NLS_CHARACTERSET';

PARAMETER VALUE
----------------- ----------------------------
NLS_CHARACTERSET AL32UTF8

SQL>

开始修改
SQL> shutdownimmediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 1603411968 bytes
FixedSize 2226912 bytes
VariableSize 402654496 bytes
Database Buffers 1191182336bytes
RedoBuffers 7348224 bytes
Database mounted.
SQL> alter session setsql_trace=true;

Session altered.

SQL> alter systemenable restricted session;

System altered.

SQL> show parameterjob_queue_process

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 1000
SQL> alter system setjob_queue_processes=0;

System altered.

SQL> show parameteraq_tm_processes

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 0
SQL> alter database open;

Database altered.

SQL> alter databasecharacter set internal_use utf8;

Database altered.

SQL> alter session setsql_trace=false;

Session altered.

SQL> shutdownimmediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1603411968 bytes
FixedSize 2226912 bytes
VariableSize 402654496 bytes
Database Buffers 1191182336bytes
Redo Buffers 7348224 bytes
Database mounted.
Database opened.
SQL>

修改之后的字符集
SQL> select * fromv$nls_parameters where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
----------------- ----------------------------
NLS_CHARACTERSET UTF8

SQL>

 

posted @ 2023-01-12 12:52  雪竹子  阅读(1020)  评论(0编辑  收藏  举报