如何在不同数据库编码之间传输数据

时间:2009-08-28 08:23:52

标签: database oracle encoding utf-8

我们有一个包含“Tranditional Chinese”字符和英文的oracle数据库,环境是:

PARAMETER   VALUE
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS  .,
NLS_CHARACTERSET    WE8PC850
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE   AMERICAN
NLS_SORT    BINARY
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_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET  UTF8
NLS_RDBMS_VERSION   9.2.0.4.0

我将此数据库中的所有数据导出为* .sql文件作为“ansi”编码,当我在同一台计算机上打开时,所有中文字符都已损坏。

当我将它导入另一个oracle并且环境是:

> NLS_LANGUAGE|AMERICAN
> NLS_TERRITORY|AMERICA NLS_CURRENCY|$
> NLS_ISO_CURRENCY|AMERICA
> NLS_NUMERIC_CHARACTERS|.,
> NLS_CHARACTERSET|WE8MSWIN1252
> NLS_CALENDAR|GREGORIAN
> NLS_DATE_FORMAT|DD-MON-RR
> NLS_DATE_LANGUAGE|AMERICAN
> NLS_SORT|BINARY
> 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_COMP|BINARY
> NLS_LENGTH_SEMANTICS|BYTE
> NLS_NCHAR_CONV_EXCP|FALSE
> NLS_NCHAR_CHARACTERSET|AL16UTF16
> NLS_RDBMS_VERSION|10.2.0.1.0

所有中文字符仍然存在损坏。 有人可以给我任何建议吗?

我还有另一个问题,为什么有时我们可以将“传统中文”或“简化中文”保存到带有“ANSI”编码的文本文件中,并且字符不会被破坏。但有时它会... ??为什么 有人可以解释所有这些奇怪的事情吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

中文字符被“损坏”的原因仅仅是因为它们不在字符集“ANSI”(windows-1252)中。此字符集仅包含拉丁字符。

偶然你有时可以让它们被某些应用程序识别,因为有些应用程序很聪明,可以理解你使用了错误的字符集(即他们猜你错了,例如记事本就是这种情况) 。但是,在你的情况下,你应该:

  • 使用包含中文字符的字符集,即:UTF-8,
  • setup your client application使用包含中文字符(NLS_LANG=AMERICAN_AMERICA.UTF8)的字符集,并使用为您工作的实用程序(SQL * Loader,数据库链接...)