如何修改ORACLEoracle 字符集修改使NLS

博客分类:
SQL& select name,value$ from props$ where name like '%NLS%';
------------------------------ ------------------------------
NLS_LANGUAGE
NLS_TERRITORY
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_NUMERIC_CHARACTERS
NLS_CHARACTERSET
NLS_CALENDAR
NLS_DATE_FORMAT
NLS_DATE_LANGUAGE
NLS_TIME_FORMAT
HH.MI.SSXFF AM
------------------------------ ------------------------------
NLS_TIMESTAMP_FORMAT
DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT
HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT
DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY
NLS_LENGTH_SEMANTICS
NLS_NCHAR_CONV_EXCP
NLS_NCHAR_CHARACTERSET
NLS_RDBMS_VERSION
10.2.0.1.0
20 rows selected.
NLS_CHARACTERSET是数据库字符集,NLS_NCHAR_CHARACTERSET是国家字符集
ORACLE中有两大类字符型数据,VARCHAR2是按照数据库字符集来存储数据。
而NVARCHAR2是按照国家字符集存储数据的。同样,CHAR和NCHAR也一样,一是数据库字符符,一是国家字符集。
转换字符集,数据库应该在RESTRICTED模式下
首先要确定修改后的字符集是不是修改前的超集,如果不是可能出现相同的代码点对应不同的字符,出现乱码的问题。
出现这个错误是 oracle 只支持从子集到超集的转变
那有什么方法可进行强制转换呢?
该指令会跳过子集与超集的检验,当然强制转换可能会造成数据的损坏,要谨慎使用!!
下面借助eygle的帖子执行。
SQL& shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
ORACLE instance started.
Total System Global Area
Fixed Size
2021568 bytes
Variable Size
Database Buffers
Redo Buffers
Database mounted.
SQL& alter session set sql_trace=
Session altered.
SQL& alter system enabl
System altered.
SQL& alter system set job_queue_processes=0;
System altered.
SQL& alter system set aq_tm_processes=0;
System altered.
Database altered.
SQL& alter database character set INTERNAL_USE UTF8;
Database altered.
SQL&update props$ set VALUE$='UTF8' where NAME='NLS_NCHAR_CHARACTERSET'
SQL& SHUTDOWN IMMEDIATE; SQL& STARTUP;
浏览: 56663 次
来自: 北京oracle修改字符集toUTF8_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
oracle修改字符集toUTF8
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢oracle_更改数据库字符集&(NLS_CHARACTERSET)
In this Document
Applies to:
Database - Standard Edition - Version 8.1.7.4 and
Oracle Database - Enterprise Edition - Version 8.1.7.4 and
Information in this document applies to any
本文章概述了更改数据库字符集或在具有不同 NLS_CHARACTERSET 的数据库之间导出/导入前进行检查的方法。
当前的 NLS_CHARACTERSET 在 NLS_DATABASE_PARAMETERS 中可以看到。
select value from NLS_DATABASE_PARAMETERS where
parameter='NLS_CHARACTERSET';
通过本文章可以基本了解这些方法,然后阅读文章末尾列出的参考文章深入了解具体的转换方法。
对于与 NLS_NCHAR_CHARACTERSET 有关的所有问题,请参阅&&The National
Character Set in Oracle 9i and 10g
要更改Oracle
Application&数据库的NLS_CHARACTERSET:请参阅&&Migrating an
Applications Installation to a New Character Set.
这是Oracle
Application&唯一支持的方法。如果您有任何疑问,请开一个Oracle
Applications SR&以寻求帮助。
尝试更改NLS_CHARACTERSET&的所有用户。
现在仍然有数据库管理员尝试通过修改props$&来更改NLS_CHARACTERSET&或。我们不支持使用这种方法,因为这将会损坏您的数据库。这是破坏整个数据集的最直接方式之一。可以尝试帮助您进行恢复,但Oracle&不能保证可以恢复数据,也不能保证恢复后的数据完全正确。我们会要求您执行完全导出操作,并重新建立整个数据库。
切勿更新props$。
A)&数据库字符集&(NLS_CHARACTERSET)
数据库的NLS_CHARACTERSET&定义了数据库中哪些字符可以存储在CHAR、、和CLOB&数据类型中。字符集不定义语言,而是定义字符的特定范围。任何语言,只要它只使用包含在该字符集中的字符,即可存储在数据库中。
更改字符集时,如果您当前使用的字符未在新字符集中定义或当前设置使用不当,则在更改NLS_CHARACTERSET&时可能会丢失数据。
切勿在字符数据类型(、、、)中存储二进制(加密)数据。如果将二进制数据作为CHAR、、或CLOB&数据类型存储处理,则可能会丢失数据,特别是在使用AL32UTF8&数据库时(即使没有使用导出导入操作)。或者,可能会出现ORA-29275&或ORA-600
[kole_t2u], [34]&等错误。
请参阅&&Problems with
(Importing) Encrypted Data After Character Set Change Using Other
NLS_CHARACTERSET Database or Upgrading the (client) Oracle
在更改字符集前,应始终使用Character Set
Scanner (Csscan)&检查是否存在这种情况。使用导出导入操作或Expdp/Impdp&时也一样。
&Installing and
Configuring Csscan in 8i and 9i (Database Character Set
&Installing and
configuring Csscan in 10g and 11g (Database Character Set
&Csscan output
B) 选择新数据库字符集
对于大多数客户,Unicode 字符集 (AL32UTF8) 是最好的选择。请参阅&&Choosing a
database character set means choosing Unicode.
您不能将 AL16UTF16 作为 NLS_CHARACTERSET,AL16UTF16 只能作为
NLS_NCHAR_CHARACTERSET,请参阅&&The
National Character Set in Oracle 9i 10g and 11g
对于非 Unicode 字符集,最佳选择是 xx8MSWIN125x 字符集,即使数据库自身在 Unix
平台上运行。原因很简单:大多数客户端都是基于 Windows 系统的,因此最适合数据库的非 Unicode
字符集是可以存储这些客户端能够识别的所有字符的字符集,即 xx8MSWIN125x 字符集:
EE8MSWIN1250 , CL8MSWIN1251, WE8MSWIN1252, EL8MSWIN1253
,TR8MSWIN1254, IW8MSWIN1255, AR8MSWIN1256, BLT8MSWIN1257,
VN8MSWIN1258, TH8TISASCII, JA16SJIS , KO16MSWIN949, ZHS16GBK,
ZHT16MSWIN950 , ZHT16HKSCS31
详细讨论,请参阅&&Choosing from
WE8ISO8859P1, WE8ISO8859P15 or WE8MSWIN1252 as db character
从版本 11g 开始,DBCA 默认提供“推荐”字符集列表用作
NLS_CHARACTERSET,出于上述相同的原因,列表中不包含类似于 WE8ISO8859P1
的字符集。请注意,Oracle仍然对这些字符集提供支持,并且根据需要,也可以使用“非推荐”字符集。有关更多信息,请参阅&&Character Set
Consolidation for Oracle Database 11g for more information.
如果必需使用 DBCA 中的一个“非推荐”字符集(如 US7ASCII 或 WE8ISO8859P1)创建数据库,则在 DBCA
的步骤 9(共 11 个)中取消选中“Character Sets(字符集)”选项卡中的“show recommended
character sets only(仅显示推荐字符集)”框。
如果想知道哪些语言可以存储在大多数常用字符集中,请参阅&&Which Character
Set Supports Which Language
如果想知道特定字符集中包含哪些字符,请参阅&&Charts of most
current mono-byte Character sets&
或者使用 Locale Builder 打开 Oracle 字符集定义,请参阅&&Using Locale
Builder to view the definition of character sets
这里有一个非常优秀的外部资源:&.
在该网站中选择某个语言后,它将显示包含此语言所需的全部字母的所有字符集概览。
请注意,Oracle 不保证该网站中的信息完全正确。
C) 更改数据库字符集。
请参阅下面适用于 Oracle Application
数据库的文章:&&Migrating an
Applications Installation to a New Character Set.
这是 Oracle Application 唯一支持的方法。如果您有任何疑问,请记录一个 Oracle
Applications SR 以寻求帮助。
要更改字符集,有两个基本方法和一个“组合”方法:
C1) 在 8i 或 9i 中使用 "ALTER DATABASE CHARACTER SET" 命令,在 10g 和 11g 中使用
这种方法并非永远适用,因为 ALTER DATABASE CHARACTER SET / CSALTER&不会更改已存储数据的实际代码点。
因此,只有在数据库中当前存储的数据是新字符集的二进制子集(即旧字符集的所有代码都有效且在新字符集中表示相同的字符,则新字符集是旧字符集的严格超集)时,才能使用该方法。
对于版本 8i / 9i,该方法记录在&&8i/9i only:
Changing the Database Character Set or the Database National
Character Set in 8i/9i
此方法也可用于这些组合:&Changing Database
Character Set - Valid Superset Definitions
请注意,虽然从技术角度来看在版本 8i 和 9i 中无需运行 Csscan,但是我们强烈建议运行
在版本 10g 和 11g 中,我们不再使用 "ALTER DATABASE CHARACTER SET"
命令,Csscan/Csalter 是唯一支持的数据库字符集更改方法。
要使用 Csalter,您需要运行 csscan(请参阅&&Installing and
configuring Csscan in 10g and 11g (Database Character Set Scanner)
),然后检查 csscan 结果从而知道是否可以运行 Csalter。
Csalter 不依赖超集定义且不使用参数,但 Csalter&是依赖
csscan 输出的。
有关 Csscan 和 Csalter 的更多信息,请参阅&&Csscan output
C2) 使用“export/import”操作(在 10g 及更高版本中使用Datapump操作)。
您只需导出当前的数据库,然后使用新字符集新建一个数据库,并将数据导入到该数据库中。
当然,您要存储的字符仍需在新旧字符集中都有正确的定义。很多时候这个条件都是无法满足的,所以需要通过对源数据库使用
csscan检测这些错误,因此在使用 exp/imp 时,我们建议始终先用 Csscan
检测是否存在问题。
如果要在现有数据库之间导出/导入特定的用户或表,且其中一个数据库是 UTF8 或 AL32UTF8 数据库,则请参阅:&ORA-01401 /
ORA-12899 While Importing Data In An AL32UTF8 / UTF8 (Unicode) Or
Other Multibyte NLS_CHARACTERSET Database.&
在进行更改时,如果旧字符集中的所有字符均能被新字符集识别(但是它们可能对同一字符使用不同的代码),则可使用导出/导入操作。
在所有 10g 版本(包括 10.1.0.5 和 10.2.0.3)和 11.1.0.6 中,使用数据抽取时,将 8 位字符集更改为
UTF8 / AL32UTF8 或其他多字节字符集可能会损坏数据。除非已应用&Patch
5874989 ,否则 Impdp 可能会损坏数据。
“旧”的导出/导入功能可以正常工作。10.2.0.4 和 11.1.0.7 补丁集中已修正此问题。
以下链接中包括了此故障的所有现有补丁集:
对于 Windows,修正程序包括在
10.1.0.5.0 Patch 20 (10.1.0.5.20P)
或更高版本中&(&&)
10.2.0.3.0 Patch 11 (10.2.0.3.11P)
或更高版本中&(&&)
从技术角度看,只需要在 impdp 端应用补丁集,但是如果您在不同的字符集之间使用
expdp/impdp,我们建议您对所有系统应用补丁集。
C3) 组合使用 ALTER DATABASE CHARACTER SET(8i、9i)/ CSALTER(10g 和 11g)与
“export/import” 操作
在大多数情况下,方法 c1 会无效,因为Csscan 会指出有些数据需要转换为新的字符集(“Convertible”数据),而方法
c2 又会占用太多时间。
在这些情况下,通常可以混合使用这两种方法:
a) 只导出 Csscan 列出的表中的“Convertible”数据(即代码在当前字符集和新字符集之间会发生转换的字符)
b) truncate 或 drop 掉这些表。
c) 再次运行 csscan,以确保所有数据现已准备好直接移到新字符集中,如果确实已准备就绪,则使用 ALTER DATABASE
CHARACTERSET(8i、9i)/CSALTER(10g 和 11g)命令(方法 C1)更改数据库的字符集。
d)由于字符集现已更改,我们只需导入在步骤 (a) 导出的数据。导入操作将转换该数据,并使用该新字符集的正确字符代码进行存储。
C4) 在 8i、9i、10g 和 11g 中的 8 位字符集之间执行字符集转换的分步指南&。
下面这些文章会指导您完成一些常用的转换操作,其中介绍了如何将上述“组合方法”(如果需要)付诸实践以及如何进行额外的校验:
从 US7ASCII 更改为 WE8MSWIN1252 或从其他 xxIOS8859Pxx 更改为 xx8MSWIN12xx
&Changing from
US7ASCII or WE8ISO8859P1 to WE8MSWIN1252
&Changing from
US7ASCII or WE8ISO8859P1 or IW8ISO8859P8 to
IW8MSWIN1255&
&Changing From
US7ASCII or WE8ISO8859P1 or AR8ISO8859P6 to
AR8MSWIN1256&
EL8ISO8859P7 to EL8MSWIN1253&
EE8ISO8859P2 to EE8MSWIN1250&
WE8ISO8859P9 to WE8ISO8859P1/WE8MSWIN1252&
WE8ISO8859P15 to WE8MSWIN1252&
其他组合:
&Changing WE8DEC to
WE8ISO8859P1, WE8ISO8859P15 or WE8MSWIN1252&
WE8ISO8859P1 to WE8ISO8859P15&
WE8MSWIN1252 to WE8ISO8859P15&
WE8ISO8859P15 TO WE8ISO8859P1
C5) 将字符集转换为 Unicode (UTF8/AL32UTF8) 的分步指南(包括导出/导入操作)
要将现有数据库迁移到 AL32UTF8(和弃用的 UTF8),可以使用一个名为 Database Migration
Assistant for Unicode (DMU) 的新工具。DMU
工具是一个独特的新一代迁移工具,可提供用于将数据库从旧编码迁移到 Unicode 的端到端解决方案。
DMU 的用户界面直观易懂,通过指导 DBA
完成整个迁移过程和自动完成许多迁移任务,极大地简化了迁移过程,而且降低了对管理员具备字符集迁移专业知识的要求。
Oracle RDBMS 11.2.0.3 和更高版本、选定的旧版本及平台组合均支持 DMU。
有关更多信息,请参阅&&The Database
Migration Assistant for Unicode (DMU) Tool 和&.&
从 Oracle 12c 数据库开始,DMU 将是唯一可用于迁移 NLS_CHARACTERSET 的工具:&CSSCAN and CSALTER
To Be Desupported after DB 11.2.
要在 Oracle 8i、9i、10g 和 11g 版本中将 NLS_CHARACTERSET 更改为 Unicode(即
AL32UTF8 或 UTF8)或要将数据导出/导入到 AL32UTF8/UTF8
数据库,请遵循&&Changing the
NLS_CHARACTERSET to AL32UTF8 / UTF8 (Unicode)
强烈建议阅读前面的&&AL32UTF8 / UTF8
(Unicode) Database Character Set Implications
上面两篇文章介绍了更改为 AL32UTF8
的操作,它们也适用于更改为任何其他宽度可变的字符集的操作,如ZHS16GBK、ZHT16MSWIN950、ZHT16HKSCS、ZHT16HKSCS31、KO16MSWIN949、JA16SJIS
但是,我们强烈建议将 AL32UTF8 作为 NLS_CHARACTERSET,因为将任何其他宽度可变的字符集作为
NLS_CHARACTERSET 并不能带来而外的好处。从根本上说,AL32UTF8 是“未来发展的方向”,AL32UTF8
支持任何其他字符集中定义的所有字符。
也可以按照&&Changing the
NLS_CHARACTERSET to AL32UTF8 / UTF8 (Unicode) 将NLS_CHARACTERSET 从
AL32UTF8 更改为 UTF8(或将 UTF8 更改为 AL32UTF8)。
如果您有 AL32UTF8 或 UTF8 数据库,但您的应用程序未准备好使用 AL32UTF8 或
UTF8,则可按照&&Changing the
NLS_CHARACTERSET From AL32UTF8 / UTF8 (Unicode) to another
NLS_CHARACTERSET
将其恢复为其他 NLS_CHARACTERSET
只有 Oracle RDBMS 版本 7 系统需要参考下面这篇文章:&Changing
NLS_CHARACTERSET from AL24UTFFSS to UTF8 - AL32UTF8
D) 其他阅读材料
更改 Oracle Application
数据库的字符集时,还有一些其他注意事项,有关这些事项的完整概述,请参阅以下文章:&Migrating an
Applications Installation to a New Character Set
请注意,如果一开始就更改数据库字符集,很有可能*无法*解决显示问题。
因此,请先检查是否可以使用 SQLdeveloper 存储/检索数据,这款工具是无需进行 NLS 配置的“好客户端”。
可从&&下载
如果数据在 SQLdeveloper 中能正常显示,则可保证它在数据库中也能正常显示,并能保证当前的 NLS_CHARACTERSET
支持该字符。
如果这样,即可参阅以下文章正确配置其他客户端,然后可以使用通过 SqlDeveloper 输入的数据作为“参考”:
&NLS_LANG Explained
(How does Client-Server Character Conversion Work?)
&The correct
NLS_LANG in a Windows Environment
&The correct
NLS_LANG on Unix Environments
&NLS_LANG and
webservers explained.
有关调试指南的详细信息,请参阅&&Troubleshooting
RDBMS (client and server) NLS Problems (Charactersets, sorts,
dates, ..)
References
Which Character Set Supports Which Language
8i/9i only: Changing the Database Character Set or the Database
National Character Set in 8i/9i
10.2.0.x Oracle Database and Networking Patches for Microsoft
AL32UTF8 / UTF8 (Unicode) Database Character Set
Implications
Globalization (NLS) - Frequently Asked Questions
Changing from US7ASCII or WE8ISO8859P1 or IW8ISO8859P8 to
IW8MSWIN1255
Character Set Consolidation for the Oracle Database ( 11gR1 and
Choosing a database character set means choosing
Changing WE8ISO8859P15 to WE8MSWIN1252
Changing WE8ISO8859P1 to WE8ISO8859P15
Changing From US7ASCII or WE8ISO8859P1 or AR8ISO8859P6 to
AR8MSWIN1256
Changing the NLS_CHARACTERSET to AL32UTF8 / UTF8
Changing WE8DEC to WE8ISO8859P1, WE8ISO8859P15 or
WE8MSWIN1252
Migrating an Applications Installation to a New Character
Changing WE8MSWIN1252 TO WE8ISO8859P15
Installing and Configuring Csscan in 8i and 9i (Database Character
Set Scanner)
The Database Migration Assistant for Unicode (DMU)
NLS_LANG Explained (How does Client-Server Character Conversion
The correct NLS_LANG in a Microsoft Windows
Environment
Using Locale Builder to view the definition of character
Changing the NLS_CHARACTERSET From AL32UTF8 / UTF8 (Unicode) to
another NLS_CHARACTERSET
Troubleshooting RDBMS (client and server) NLS Problems
(Charactersets, sorts, dates, ..)
Choosing between WE8ISO8859P1, WE8ISO8859P15 or WE8MSWIN1252 as
NLS_CHARACTERSET
10.1.0.x Oracle Database and Networking Patches for Microsoft
Changing WE8ISO8859P15 TO WE8ISO8859P1
Problems with (Importing) Encrypted Data After Character Set Change
Using Other NLS_CHARACTERSET Database or Upgrading the (client)
Oracle Version
ORA-01401 / ORA-12899 While Importing Data In An AL32UTF8 / UTF8
(Unicode) Or Other Multibyte NLS_CHARACTERSET
8i and 9i only: Alter Database Character Set - Valid Superset
Definitions
The National Character Set ( NLS_NCHAR_CHARACTERSET ) in Oracle 9i,
10g and 11g
Charts of most current mono-byte / 8 bit Character
Changing WE8ISO8859P9 to WE8ISO8859P1/WE8MSWIN1252
Changing EL8ISO8859P7 to EL8MSWIN1253
NLS_LANG and webservers explained.
Installing and configuring Csscan in 10g and 11g (Database
Character Set Scanner)
Changing AL24UTFFSS to UTF8 - AL32UTF8 with ALTER DATABASE
CHARACTERSET
Changing US7ASCII or WE8ISO8859P1 to WE8MSWIN1252
Changing EE8ISO8859P2 to EE8MSWIN1250
The correct NLS_LANG setting in Unix Environments
Csscan Output Explained
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 xshell如何修改字符集 的文章

 

随机推荐