在Oracle SQL LOAD期间未正确插入欧元'€'符号

时间:2015-05-28 16:30:53

标签: oracle oracle11g sqlplus sql-loader dbms-output

我正在使用sqlldr加载csv文件。 该文件包含插入VARCHAR2列的符号"€"。 加载后,数据库显示'¿'而不是欧元符号。 我在加载期间在控制文件中指定了字符集:

LOAD DATA 
CHARACTERSET WE8MSWIN1252

我在Solaris机器上运行所有这些,顺便说一句,它不能显示'€'符号,当我点击键获取时,我给了'.' €。

我们正在将数据用于BI目的,因此我们必须保留varchar2列,即使将其类型更改为nvarchar2也会正确插入€符号。

  

您能为此问题提出任何其他解决方案吗?

当我在machin上运行locale命令时,我得到:

LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

和我的NLS数据库参数是:

NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS  .,
NLS_CHARACTERSET    WE8DEC
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_LANG变量,但似乎没有任何效果。 问候。

1 个答案:

答案 0 :(得分:4)

您的数据库未配置为支持VARCHAR2列中的欧元字符。您的数据库NLS_CHARACTERSET of WE8DEC表示它使用旧的DEC MCS character set。该字符集早于欧元字符(它甚至比ISO 8859-1字符集早于欧元之前)。因此,您无法在数据库的VARCHAR2列中有效地存储欧元字符。

您可以将数据库字符集更改为支持Euro字符的内容。有许多这样的字符集,但我猜想ISO-8859-15,Windows-1252或UTF-8将是最简单的迁移。就个人而言,我总是更喜欢Unicode(UTF-8,这是Oracle中的AL32UTF8字符集),但您可能有理由更喜欢单字节字符集。或者,您可以将此列(以及需要使用欧元字符的任何其他列)声明为NVARCHAR2列,因为您的国家字符集支持Unicode。支持NVARCHAR2列可能需要更改前端应用程序。如果您可以更改数据库字符集,那么这将是我对添加NVARCHAR2列的强烈偏好。