【问题标题】:UTF 8 from Oracle tablesOracle 表中的 UTF 8
【发布时间】:2012-01-06 22:46:26
【问题描述】:

客户要求将一些表提取到 csv 中,都没有问题。他们刚刚要求我们确保文件始终为 UTF 8 格式。

我如何检查实际情况。或者甚至更好地强制它这样做,我可以在运行查询之前在过程中设置它吗?

数据是从 Oracle 10g 数据库中提取的。

我应该检查什么?

谢谢

【问题讨论】:

    标签: oracle


    【解决方案1】:

    您可以使用以下查询检查数据库字符集:

    select value from nls_database_parameters 
    where parameter='NLS_CHARACTERSET'
    

    如果它显示 AL32UTF8,那么您的数据库就是您需要的格式,如果导出不会影响它,那么您就完成了。

    您可以阅读有关 Oracle 全球化支持 herehere 的有关上述 NLS 参数的信息。

    【讨论】:

    • 这不是数据库字符集吗?如果 Oracle 认为您的客户端需要不同的字符集,它可能会转换。
    【解决方案2】:

    您究竟是如何生成 CSV 文件的?根据具体的架构,会有不同的答案。

    例如,如果您使用 SQL*Plus 提取数据,则需要将客户端计算机上的 NLS_LANG 设置为适当的值(即 AMERICAN_AMERICA.AL32UTF8),以强制将数据发送到UTF-8 格式的客户端计算机。如果您使用其他方法,NLS_LANG 可能重要也可能不重要。

    【讨论】:

      【解决方案3】:

      您需要寻找的是 hte 输入中的 8 位 ascii 字符(如果有)被翻译成双字节 utf-8 字符。

      这高度依赖于您的本地 ASCII 代码页,但通常:- ASCII "£" 应该是 ascii 中的 x'A3' 神奇地变成了 utf-8 中的 x'C2A3'。

      【讨论】:

        【解决方案4】:

        好吧,这并不像我最初希望的那么简单。上面的查询返回 AL32UTF8。

        我正在使用在数据库上编译的存储过程来循环遍历存储过程中数组中保存的表名列表。

        我使用 DBMS_SQL 包构建 SQL 并使用 UTL_FILE.PUT_NCHAR 将数据插入文本文件。

        我相信我的结果输出将是 UTF 8,但是在 Textpad 中打开说它是 ANSI 并且数据在某些地方是乱码:)

        干杯

        NLS_CHARACTERSET 是 AL32UTF8 而 NLS_NCHAR_CHARACTERSET 是 AL16UTF16 可能很重要

        【讨论】:

        • 文件只是一个字节序列。 Textpad 正在向您展示如何将这些字节转换为可显示的字符,假设它是一个 ANSI 文件。我使用 PSPad,它允许您选择它用来解释字节的编码。我猜 Textpad 也有类似的东西。
        • 有趣的谢谢,这确实改变了我的理解。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 2016-05-20
        • 2021-09-16
        • 2015-06-02
        相关资源
        最近更新 更多