gpt4 book ai didi

oracle - 使用 UTF-8 编码从 Oracle 数据库假脱机文件时的编码问题

转载 作者:行者123 更新时间:2023-12-04 14:53:16 27 4
gpt4 key购买 nike

问题描述:
我有一个在 Oracle 数据库(Windows 或 Unix OS)上运行的脚本。它提取数据,然后将其假脱机为 .txt 文件。
为确保文件不变,在运行脚本时对数据进行散列,然后在 Web 应用程序中重新计算该散列。这可以工作 9/10 次,但有时它会提供不匹配,即使文件是相同的并且我将其隔离为编码问题。
为了确定用于文件的编码,脚本将 3 个非 ASCII 字符写入文件,这些字符在不同的编码方案中编码不同。这些稍后会映射到后端。

--Encoding related information
SPOOL &&file_desc/Encoding.txt
SELECT ('€'||';'||'ƒ'||';'||'‰') FROM sys.dual;
SPOOL off
预期结果
在使用 UTF-8 编码的数据库上,应正确假脱机处理具有 NONASCII 字符的数据,并且也应正确假脱机处理 3 个非 ASCII 字符。
实际结果
使用 .AL32UTF8 系统字符集(与 DB 相同)时,数据正确假脱机,但编码的 3 个字符没有。这使我无法确定使用了哪种编码方案。
数据库具有以下字符集(从 database_properties 获得):
NLS_CHARACTESET: AL32UTF8
NLS_NCHAR_CHARACTERSET:AL16UTF16
SQL-Developer 工作
使用 SQL-Developer 时(将编码设置为 UTF8 后)),我没有问题。日语和希腊语字符都正确显示,用于编码的字符也正确显示,在以后重新计算时导致成功的散列匹配。
SQL*Plus 不起作用
我也需要它在 SQL*Plus 中工作,但我一直遇到问题。我尝试了一系列不同的变化。 DB是Oracle 18c express版:
在 SQL*Plus 上尝试的变体
  • 仅将字符代码页设置为与 DB 对应的 utf-8
    chcp 65001(utf-8 代码)NLS_LANG 字符集:.WE8MSWIN1252
    表名包含日文字符的文件给出
    编码“错误”:JAPANESE¿ 具有 3 个字符的文件用于
    确定编码效果很好:€;ƒ;‰
  • 代码页没有变化,但更新了 NLS_LANG 字符集
    NLS_LANG charset: .AL32UTF8 表名包含的文件
    现在日文字符显示正常:JAPANESE世 带有 3 的文件
    用于确定编码的字符现在突然“空”了:;;
  • 将 NLS_LANG 设置为与 DB 相同并更新代码页 chcp
    65001 (utf-8 的代码) NLS_LANG 字符集: .AL32UTF8 带有
    包括日文字符的表名现在显示正常:
    JAPANESE世 用于确定编码的 3 个字符的文件是
    然而,现在突然“空”了:;;
  • 将 NLS_LANG 设置为 NLS_NCHAR_Characterset。以防万一我也
    试图将系统字符集设置为 AL16UTF16,它等于
    NLS_NCHAR_Characterset,认为这可能有助于解决问题,
    但随后我收到以下错误:错误 19 初始化 SQL*PLUS
    此操作系统环境的 NLS 字符集无效

  • 结论/问题
    代码页并不重要,因为它只关心输出到命令窗口。
    正如所料,当使用 WE8MSWIN1252 时,非 ASCII 字符的假脱机不起作用,因为它不知道字符。
    然而,当使用 AL32UTF8 时,sys.dual 的 3 个非ASCII 字符的假脱机不再起作用,即使它知道字符。
    我已经花了几天的时间来隔离这个问题,我不知道为什么是后者,有人可以帮助我吗?

    * 编辑 , kfinity 提供了解决方案,虽然不是 100% 确定为什么会这样。所以如果有人知道吗?
    如果我们将 select 语句替换为以下内容,它确实有效:
    select unistr('\20AC;\0192;\2030') from dual;

    最佳答案

    我不太确定问题是什么,但是如果您尝试这样做:

    select unistr('\20AC;\0192;\2030') from dual;
    我认为它会绕过让 SQL*Plus 从 .sql 文件中读取正确字符值的问题。

    关于oracle - 使用 UTF-8 编码从 Oracle 数据库假脱机文件时的编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68667102/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com