【问题标题】:Euro '€' symbol not inserted correctly during Oracle SQL LOAD在 Oracle SQL LOAD 期间未正确插入欧元“€”符号
【发布时间】:2015-08-11 07:07:32
【问题描述】:

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

LOAD DATA 
CHARACTERSET WE8MSWIN1252

我在Solaris 机器上运行所有这些,顺便说一句,它无法显示“€”符号,我给了我一个'.',而不是当我按下键来获取€。

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

您能否针对该问题提出任何其他解决方案?

当我在机器上运行语言环境命令时,我得到:

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 变量,但似乎没有任何效果。 问候。

【问题讨论】:

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


    【解决方案1】:

    您的数据库未配置为支持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 字符集),但您可能有理由更喜欢单字节字符集。或者,您可以将此列(以及任何其他需要使用欧元字符的列)声明为 NVARCHAR2 列,因为您的国家字符集支持 Unicode。支持NVARCHAR2 列可能需要更改您的前端应用程序。如果您可以更改数据库字符集,那将是我对添加 NVARCHAR2 列的强烈偏好。

    【讨论】:

    • 我就是这么想的。我们选择了 nvarchar2 解决方案,因为客户不会让我们接近他的数据库设置。让我们希望这不会对我们的前端产生影响。非常感谢您的准确回答。
    猜你喜欢
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多