更换oracle nls,oracle_更改数据库字符集 (NLS_CHARACTERSET)

In this Document

Applies to:

Oracle

Database - Standard Edition - Version 8.1.7.4 and

later

Oracle Database - Enterprise Edition - Version 8.1.7.4 and

later

Information in this document applies to any

platform.

Purpose

本文章概述了更改数据库字符集或在具有不同 NLS_CHARACTERSET 的数据库之间导出/导入前进行检查的方法。

当前的 NLS_CHARACTERSET 在 NLS_DATABASE_PARAMETERS 中可以看到。

select value from NLS_DATABASE_PARAMETERS where

parameter='NLS_CHARACTERSET';

通过本文章可以基本了解这些方法,然后阅读文章末尾列出的参考文章深入了解具体的转换方法。

对于与 NLS_NCHAR_CHARACTERSET 有关的所有问题,请参阅 Note

276914.1The National

Character Set in Oracle 9i and 10g

要更改Oracle

Application数据库的NLS_CHARACTERSET:请参阅Note

124721.1Migrating an

Applications Installation to a New Character Set.

这是Oracle

Application唯一支持的方法。如果您有任何疑问,请开一个Oracle

Applications SR以寻求帮助。

Scope

尝试更改NLS_CHARACTERSET的所有用户。

现在仍然有数据库管理员尝试通过修改props$来更改NLS_CHARACTERSET或NLS_NCHAR_CHARACTERSET。我们不支持使用这种方法,因为这将会损坏您的数据库。这是破坏整个数据集的最直接方式之一。Oracle Support可以尝试帮助您进行恢复,但Oracle不能保证可以恢复数据,也不能保证恢复后的数据完全正确。我们会要求您执行完全导出操作,并重新建立整个数据库。

切勿更新props$。

Details

A)数据库字符集(NLS_CHARACTERSET)

Oracle数据库的NLS_CHARACTERSET定义了数据库中哪些字符可以存储在CHAR、VARCHAR2、LONG和CLOB数据类型中。字符集不定义语言,而是定义字符的特定范围。任何语言,只要它只使用包含在该字符集中的字符,即可存储在数据库中。

更改字符集时,如果您当前使用的字符未在新字符集中定义或当前设置使用不当,则在更改NLS_CHARACTERSET时可能会丢失数据。

切勿在字符数据类型(CHAR、VARCHAR2、LONG、CLOB)中存储“二进制”(加密)数据。如果将二进制数据作为CHAR、VARCHAR2、LONG或CLOB数据类型存储/处理,则可能会丢失数据,特别是在使用AL32UTF8数据库时(即使没有使用导出/导入操作)。或者,可能会出现ORA-29275或ORA-600

[kole_t2u], [34]等错误。

请参阅Note

1297507.1Problems with

(Importing) Encrypted Data After Character Set Change Using Other

NLS_CHARACTERSET Database or Upgrading the (client) Oracle

Version

在更改字符集前,应始终使用Character Set

Scanner (Csscan)检查是否存在这种情况。使用导出/导入操作或Expdp/Impdp时也一样。

Note 458122.1Installing and

Configuring Csscan in 8i and 9i (Database Character Set

Scanner)

Note 745809.1Installing and

configuring Csscan in 10g and 11g (Database Character Set

Scanner)

Note 444701.1Csscan output

explained

B) 选择新数据库字符集

对于大多数客户,Unicode 字符集 (AL32UTF8) 是最好的选择。请参阅 Note

333489.1Choosing a

database character set means choosing Unicode.

您不能将 AL16UTF16 作为 NLS_CHARACTERSET,AL16UTF16 只能作为

NLS_NCHAR_CHARACTERSET,请参阅 Note:276914.1The

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

详细讨论,请参阅 Note

264294.1Choosing from

WE8ISO8859P1, WE8ISO8859P15 or WE8MSWIN1252 as db character

set.

从版本 11g 开始,DBCA 默认提供“推荐”字符集列表用作

NLS_CHARACTERSET,出于上述相同的原因,列表中不包含类似于 WE8ISO8859P1

的字符集。请注意,Oracle仍然对这些字符集提供支持,并且根据需要,也可以使用“非推荐”字符集。有关更多信息,请参阅 Note

306411.1Character Set

Consolidation for Oracle Database 11g for more information.

如果必需使用 DBCA 中的一个“非推荐”字符集(如 US7ASCII 或 WE8ISO8859P1)创建数据库,则在 DBCA

的步骤 9(共 11 个)中取消选中“Character Sets(字符集)”选项卡中的“show recommended

character sets only(仅显示推荐字符集)”框。

如果想知道哪些语言可以存储在大多数常用字符集中,请参阅 Note

62421.1Which Character

Set Supports Which Language

如果想知道特定字符集中包含哪些字符,请参阅 Note

282336.1Charts of most

current mono-byte Character sets

或者使用 Locale Builder 打开 Oracle 字符集定义,请参阅 Note

223706.1Using Locale

Builder to view the definition of character sets

这里有一个非常优秀的外部资源: http://www.eki.ee/letter/.

在该网站中选择某个语言后,它将显示包含此语言所需的全部字母的所有字符集概览。

请注意,Oracle 不保证该网站中的信息完全正确。

C) 更改数据库字符集。

请参阅下面适用于 Oracle Application

数据库的文章: Note

124721.1Migrating an

Applications Installation to a New Character Set.

这是 Oracle Application 唯一支持的方法。如果您有任何疑问,请记录一个 Oracle

Applications SR 以寻求帮助。

要更改字符集,有两个基本方法和一个“组合”方法:

C1) 在 8i 或 9i 中使用 "ALTER DATABASE CHARACTER SET" 命令,在 10g 和 11g 中使用

CSALTER。

这种方法并非永远适用,因为 ALTER DATABASE CHARACTER SET / CSALTER不会更改已存储数据的实际代码点。

因此,只有在数据库中当前存储的数据是新字符集的二进制子集(即旧字符集的所有代码都有效且在新字符集中表示相同的字符,则新字符集是旧字符集的严格超集)时,才能使用该方法。

对于版本 8i / 9i,该方法记录在 Note

66320.18i/9i only:

Changing the Database Character Set or the Database National

Character Set in 8i/9i

此方法也可用于这些组合:Note

119164.1Changing Database

Character Set - Valid Superset Definitions

请注意,虽然从技术角度来看在版本 8i 和 9i 中无需运行 Csscan,但是我们强烈建议运行

csscan。

在版本 10g 和 11g 中,我们不再使用 "ALTER DATABASE CHARACTER SET"

命令,Csscan/Csalter 是唯一支持的数据库字符集更改方法。

要使用 Csalter,您需要运行 csscan(请参阅 Note

745809.1Installing and

configuring Csscan in 10g and 11g (Database Character Set Scanner)

),然后检查 csscan 结果从而知道是否可以运行 Csalter。

Csalter 不依赖超集定义且不使用参数,但 Csalter是依赖

csscan 输出的。

有关 Csscan 和 Csalter 的更多信息,请参阅 Note

444701.1Csscan output

explained

C2) 使用“export/import”操作(在 10g 及更高版本中使用Datapump操作)。

您只需导出当前的数据库,然后使用新字符集新建一个数据库,并将数据导入到该数据库中。

当然,您要存储的字符仍需在新旧字符集中都有正确的定义。很多时候这个条件都是无法满足的,所以需要通过对源数据库使用

csscan检测这些错误,因此在使用 exp/imp 时,我们建议始终先用 Csscan

检测是否存在问题。

如果要在现有数据库之间导出/导入特定的用户或表,且其中一个数据库是 UTF8 或 AL32UTF8 数据库,则请参阅:Note

1297961.1ORA-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 补丁集中已修正此问题。

以下链接中包括了此故障的所有现有补丁集:https://updates.oracle.com/download/5874989.html

对于 Windows,修正程序包括在

10.1.0.5.0 Patch 20 (10.1.0.5.20P)

或更高版本中 (Note

276548.1)

10.2.0.3.0 Patch 11 (10.2.0.3.11P)

或更高版本中 (Note

342443.1)

从技术角度看,只需要在 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

字符集

Note 555823.1Changing from

US7ASCII or WE8ISO8859P1 to WE8MSWIN1252

Note 1213683.1Changing from

US7ASCII or WE8ISO8859P1 or IW8ISO8859P8 to

IW8MSWIN1255

Note 260022.1Changing From

US7ASCII or WE8ISO8859P1 or AR8ISO8859P6 to

AR8MSWIN1256

Note 261871.1Changing

EL8ISO8859P7 to EL8MSWIN1253

Note 263119.1Changing

EE8ISO8859P2 to EE8MSWIN1250

Note 266309.1Changing

WE8ISO8859P9 to WE8ISO8859P1/WE8MSWIN1252

Note 246008.1Changing

WE8ISO8859P15 to WE8MSWIN1252

其他组合:

Note 1104893.1Changing WE8DEC to

WE8ISO8859P1, WE8ISO8859P15 or WE8MSWIN1252

Note 257722.1Changing

WE8ISO8859P1 to WE8ISO8859P15

Note 261639.1Changing

WE8MSWIN1252 to WE8ISO8859P15

Note 273281.1Changing

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。

有关更多信息,请参阅 Note

1272374.1The Database

Migration Assistant for Unicode (DMU) Tool 和OTN上的DMU页面.

从 Oracle 12c 数据库开始,DMU 将是唯一可用于迁移 NLS_CHARACTERSET 的工具:note

1418321.1CSSCAN and CSALTER

To Be Desupported after DB 11.2.

要在 Oracle 8i、9i、10g 和 11g 版本中将 NLS_CHARACTERSET 更改为 Unicode(即

AL32UTF8 或 UTF8)或要将数据导出/导入到 AL32UTF8/UTF8

数据库,请遵循 Note

260192.1Changing the

NLS_CHARACTERSET to AL32UTF8 / UTF8 (Unicode)

强烈建议阅读前面的 Note

788156.1AL32UTF8 / UTF8

(Unicode) Database Character Set Implications

上面两篇文章介绍了更改为 AL32UTF8

的操作,它们也适用于更改为任何其他宽度可变的字符集的操作,如ZHS16GBK、ZHT16MSWIN950、ZHT16HKSCS、ZHT16HKSCS31、KO16MSWIN949、JA16SJIS

...

但是,我们强烈建议将 AL32UTF8 作为 NLS_CHARACTERSET,因为将任何其他宽度可变的字符集作为

NLS_CHARACTERSET 并不能带来而外的好处。从根本上说,AL32UTF8 是“未来发展的方向”,AL32UTF8

支持任何其他字符集中定义的所有字符。

也可以按照 Note

260192.1Changing the

NLS_CHARACTERSET to AL32UTF8 / UTF8 (Unicode) 将NLS_CHARACTERSET 从

AL32UTF8 更改为 UTF8(或将 UTF8 更改为 AL32UTF8)。

如果您有 AL32UTF8 或 UTF8 数据库,但您的应用程序未准备好使用 AL32UTF8 或

UTF8,则可按照 note

1283764.1Changing the

NLS_CHARACTERSET From AL32UTF8 / UTF8 (Unicode) to another

NLS_CHARACTERSET

将其恢复为其他 NLS_CHARACTERSET

只有 Oracle RDBMS 版本 7 系统需要参考下面这篇文章:Note

234381.1Changing

NLS_CHARACTERSET from AL24UTFFSS to UTF8 - AL32UTF8

D) 其他阅读材料

更改 Oracle Application

数据库的字符集时,还有一些其他注意事项,有关这些事项的完整概述,请参阅以下文章:Note

124721.1Migrating an

Applications Installation to a New Character Set

请注意,如果一开始就更改数据库字符集,很有可能*无法*解决显示问题。

因此,请先检查是否可以使用 SQLdeveloper 存储/检索数据,这款工具是无需进行 NLS 配置的“好客户端”。

可从 http://www.oracle.com/technology/products/database/sql_developer/下载

如果数据在 SQLdeveloper 中能正常显示,则可保证它在数据库中也能正常显示,并能保证当前的 NLS_CHARACTERSET

支持该字符。

如果这样,即可参阅以下文章正确配置其他客户端,然后可以使用通过 SqlDeveloper 输入的数据作为“参考”:

Note 158577.1NLS_LANG Explained

(How does Client-Server Character Conversion Work?)

Note 179133.1The correct

NLS_LANG in a Windows Environment

Note 264157.1The correct

NLS_LANG on Unix Environments

Note 229786.1NLS_LANG and

webservers explained.

有关调试指南的详细信息,请参阅 Note

788931.1Troubleshooting

RDBMS (client and server) NLS Problems (Charactersets, sorts,

dates, ..)

References

NOTE:62421.1-

Which Character Set Supports Which Language

NOTE:66320.1-

8i/9i only: Changing the Database Character Set or the Database

National Character Set in 8i/9i

NOTE:342443.1-

10.2.0.x Oracle Database and Networking Patches for Microsoft

Platforms

NOTE:788156.1-

AL32UTF8 / UTF8 (Unicode) Database Character Set

Implications

NOTE:60134.1-

Globalization (NLS) - Frequently Asked Questions

NOTE:1213683.1-

Changing from US7ASCII or WE8ISO8859P1 or IW8ISO8859P8 to

IW8MSWIN1255

NOTE:306411.1-

Character Set Consolidation for the Oracle Database ( 11gR1 and

up)

NOTE:333489.1-

Choosing a database character set means choosing

Unicode

NOTE:246008.1-

Changing WE8ISO8859P15 to WE8MSWIN1252

NOTE:257722.1-

Changing WE8ISO8859P1 to WE8ISO8859P15

NOTE:260022.1-

Changing From US7ASCII or WE8ISO8859P1 or AR8ISO8859P6 to

AR8MSWIN1256

NOTE:260192.1-

Changing the NLS_CHARACTERSET to AL32UTF8 / UTF8

(Unicode)

NOTE:1104893.1-

Changing WE8DEC to WE8ISO8859P1, WE8ISO8859P15 or

WE8MSWIN1252

NOTE:124721.1-

Migrating an Applications Installation to a New Character

Set

NOTE:261639.1-

Changing WE8MSWIN1252 TO WE8ISO8859P15

NOTE:458122.1-

Installing and Configuring Csscan in 8i and 9i (Database Character

Set Scanner)

NOTE:1272374.1-

The Database Migration Assistant for Unicode (DMU)

Tool

NOTE:158577.1-

NLS_LANG Explained (How does Client-Server Character Conversion

Work?)

NOTE:179133.1-

The correct NLS_LANG in a Microsoft Windows

Environment

NOTE:223706.1-

Using Locale Builder to view the definition of character

sets

NOTE:1283764.1-

Changing the NLS_CHARACTERSET From AL32UTF8 / UTF8 (Unicode) to

another NLS_CHARACTERSET

NOTE:788931.1-

Troubleshooting RDBMS (client and server) NLS Problems

(Charactersets, sorts, dates, ..)

NOTE:264294.1-

Choosing between WE8ISO8859P1, WE8ISO8859P15 or WE8MSWIN1252 as

NLS_CHARACTERSET

NOTE:276548.1-

10.1.0.x Oracle Database and Networking Patches for Microsoft

Platforms

NOTE:273281.1-

Changing WE8ISO8859P15 TO WE8ISO8859P1

NOTE:1297507.1-

Problems with (Importing) Encrypted Data After Character Set Change

Using Other NLS_CHARACTERSET Database or Upgrading the (client)

Oracle Version

NOTE:1297961.1-

ORA-01401 / ORA-12899 While Importing Data In An AL32UTF8 / UTF8

(Unicode) Or Other Multibyte NLS_CHARACTERSET

Database.

NOTE:119164.1-

8i and 9i only: Alter Database Character Set - Valid Superset

Definitions

NOTE:276914.1-

The National Character Set ( NLS_NCHAR_CHARACTERSET ) in Oracle 9i,

10g and 11g

NOTE:282336.1-

Charts of most current mono-byte / 8 bit Character

sets

NOTE:266309.1-

Changing WE8ISO8859P9 to WE8ISO8859P1/WE8MSWIN1252

NOTE:261871.1-

Changing EL8ISO8859P7 to EL8MSWIN1253

NOTE:229786.1-

NLS_LANG and webservers explained.

NOTE:745809.1-

Installing and configuring Csscan in 10g and 11g (Database

Character Set Scanner)

NOTE:234381.1-

Changing AL24UTFFSS to UTF8 - AL32UTF8 with ALTER DATABASE

CHARACTERSET

NOTE:555823.1-

Changing US7ASCII or WE8ISO8859P1 to WE8MSWIN1252

NOTE:263119.1-

Changing EE8ISO8859P2 to EE8MSWIN1250

NOTE:264157.1-

The correct NLS_LANG setting in Unix Environments

NOTE:444701.1-

Csscan Output Explained

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值