Oracle SQL LOAD 期间未正确插入欧元“€”符号
Euro '€' symbol not inserted correctly during Oracle SQL LOAD
我正在使用 sqlldr 加载一个 csv 文件。
该文件包含插入到 VARCHAR2 列中的符号 "€"
。
加载后,数据库显示 '¿'
而不是欧元符号。
我在加载时在控制文件中指定了字符集:
LOAD DATA
CHARACTERSET WE8MSWIN1252
我 运行 在一台 Solaris
机器上完成所有这些,顺便说一句,它不能显示 '€' 符号,我给了我一个 '.'
当我按下键获得 €.
我们将数据用于 BI 目的,因此我们必须保留 varchar2 列,即使将其类型更改为 nvarchar2 也会正确插入 € 符号。
Can you suggest any other solution for the issue?
当我在机器上执行 运行 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 means that it uses the old DEC MCS character set。该字符集早于欧元字符(它甚至比同样早于欧元的 ISO 8859-1 字符集更早)。因此,您无法在数据库的 VARCHAR2
列中有效地存储欧元字符。
您可以将数据库字符集更改为支持欧元字符的字符集。有很多这样的字符集,但我猜 ISO-8859-15、Windows-1252 或 UTF-8 将是最简单的迁移。就个人而言,我总是更喜欢 Unicode(UTF-8,即 Oracle 中的 AL32UTF8 字符集),但您可能有理由更喜欢单字节字符集。或者,您可以将此列(以及任何其他需要使用欧元字符的列)声明为 NVARCHAR2
列,因为您的国家字符集支持 Unicode。支持 NVARCHAR2
列可能需要更改您的前端应用程序。如果您可以更改数据库字符集,那将是我强烈希望添加 NVARCHAR2
列。
我正在使用 sqlldr 加载一个 csv 文件。
该文件包含插入到 VARCHAR2 列中的符号 "€"
。
加载后,数据库显示 '¿'
而不是欧元符号。
我在加载时在控制文件中指定了字符集:
LOAD DATA
CHARACTERSET WE8MSWIN1252
我 运行 在一台 Solaris
机器上完成所有这些,顺便说一句,它不能显示 '€' 符号,我给了我一个 '.'
当我按下键获得 €.
我们将数据用于 BI 目的,因此我们必须保留 varchar2 列,即使将其类型更改为 nvarchar2 也会正确插入 € 符号。
Can you suggest any other solution for the issue?
当我在机器上执行 运行 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 means that it uses the old DEC MCS character set。该字符集早于欧元字符(它甚至比同样早于欧元的 ISO 8859-1 字符集更早)。因此,您无法在数据库的 VARCHAR2
列中有效地存储欧元字符。
您可以将数据库字符集更改为支持欧元字符的字符集。有很多这样的字符集,但我猜 ISO-8859-15、Windows-1252 或 UTF-8 将是最简单的迁移。就个人而言,我总是更喜欢 Unicode(UTF-8,即 Oracle 中的 AL32UTF8 字符集),但您可能有理由更喜欢单字节字符集。或者,您可以将此列(以及任何其他需要使用欧元字符的列)声明为 NVARCHAR2
列,因为您的国家字符集支持 Unicode。支持 NVARCHAR2
列可能需要更改您的前端应用程序。如果您可以更改数据库字符集,那将是我强烈希望添加 NVARCHAR2
列。