在Oracle外部表中处理UTF-8字符

在Oracle外部表中处理UTF-8字符,utf-8,oracle11g,Utf 8,Oracle11g,我有一个从固定长度文件读取的外部表。该文件应包含特殊字符。在我的例子中,包含特殊字符的单词是“哥德堡”。因为“ö”是一个特殊字符,看起来Oracle将其视为2个字节。这就造成了麻烦。文件中的后续字段被移位1字节,从而弄乱了数据。以前有人面对过这个问题吗。到目前为止,我们尝试了以下解决方案: 将NLS_LANG的值更改为AMERICAN_AMERICA。WE8ISO8859P1 已尝试将数据库字符集设置为UTF-8 尝试使用ALTER SYSTEM将NLS_LENGTH_SYMMANTIC更改为C

我有一个从固定长度文件读取的外部表。该文件应包含特殊字符。在我的例子中,包含特殊字符的单词是“哥德堡”。因为“ö”是一个特殊字符,看起来Oracle将其视为2个字节。这就造成了麻烦。文件中的后续字段被移位1字节,从而弄乱了数据。以前有人面对过这个问题吗。到目前为止,我们尝试了以下解决方案:

将NLS_LANG的值更改为AMERICAN_AMERICA。WE8ISO8859P1
已尝试将数据库字符集设置为UTF-8
尝试使用ALTER SYSTEM将NLS_LENGTH_SYMMANTIC更改为CHAR而不是BYTE
已尝试将外部表格字符集更改为:AL32UTF8
已尝试将外部表字符集更改为:UTF-8

什么都不管用。 其他详情包括:

  • 文件是UTF-8编码的
  • 操作系统:RHEL
  • 数据库:Oracle 11g

还有什么我可能遗漏的吗?任何帮助都将不胜感激。谢谢

nls_length_语义仅适用于创建新表

下面是我为解决这个问题所做的

  records delimited by newline
  CHARACTERSET AL32UTF8
  STRING SIZES ARE IN CHARACTERS 
i、 e


非常感谢。在这里解决了我的问题。
ALTER SESSION SET nls_length_semantics = CHAR
/
CREATE TABLE TDW_OWNER.SDP_TST_EXT
(
    COST_CENTER_CODE VARCHAR2(10)     NULL,
    COST_CENTER_DESC VARCHAR2(40)     NULL,
    SOURCE_CLIENT    VARCHAR2(3)      NULL,
    NAME1            VARCHAR2(35)     NULL
)
ORGANIZATION EXTERNAL
 ( TYPE ORACLE_LOADER
   DEFAULT DIRECTORY DBA_DATA_DIR
   ACCESS PARAMETERS
    ( records delimited by newline
      CHARACTERSET AL32UTF8
      STRING SIZES ARE IN CHARACTERS 
        logfile DBA_DATA_DIR:'sdp_tst_ext_%p.log'
        badfile DBA_DATA_DIR:'sdp_tst_ext_%p.bad'
        discardfile DBA_DATA_DIR:'sdp_tst_ext_%p.dsc'
        fields
    notrim
       (
             COST_CENTER_CODE CHAR(10)
            ,COST_CENTER_DESC  CHAR(40)
            ,SOURCE_CLIENT  CHAR(3)
            ,NAME1  CHAR(35)
           )
    )
   LOCATION (DBA_DATA_DIR:'sdp_tst.dat')
 )
REJECT LIMIT UNLIMITED
NOPARALLEL
NOROWDEPENDENCIES
/