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

LOAD DATA
CHARACTERSET WE8MSWIN1252


我正在Solaris机器上运行所有这些程序,顺便说一下,该机器无法显示'€'符号,而是在我敲键获取€时给了我'.'

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


您可以提出其他解决方案吗?


当我在机器上运行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变量,但似乎没有任何效果。
问候。

最佳答案

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

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

关于oracle - 在Oracle SQL LOAD期间未正确插入欧元“€”符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30512244/

10-10 05:36