将数据从 oracle sql plus 导出到 csv 时,Hypen 转换为问号

Posted

技术标签:

【中文标题】将数据从 oracle sql plus 导出到 csv 时,Hypen 转换为问号【英文标题】:Hypen converted to question mark when exporting data from oracle sql plus to csv 【发布时间】:2021-12-30 06:22:29 【问题描述】:

Test - Text 正在导出后转换为 csv 中的Test ? Text

我在 unix 中运行这个脚本

【问题讨论】:

select dump(that_column) from your_table 返回什么(对于“Test -”值)? 如何导出数据。如果使用 Oracle 提供的 sqldeveloper.exe,使用 select /*csv*/ * from table 很容易取出数据。这将为您提供逗号分隔值输出 不,我们没有使用 sqldeveloper,我们在 linux box 上提交 .sql 脚本 【参考方案1】:

您的文本中的连字符可能不是真正的连字符,而是一个破折号或破折号。从 Microsoft Word 等位置复制源数据时,这种情况很常见。

您可以运行如下查询来查看字符串中每个字符的 ASCII 值。在我的示例文本中,我将第一个“破折号”作为连字符,将第二个“破折号”作为破折号。它们看起来几乎一样,但实际上是不同的。

WITH test_text (t) AS (SELECT 'Test -– Text' FROM DUAL)
    SELECT t,
           LEVEL                            AS char_position,
           SUBSTR (t, LEVEL, 1)             AS this_char,
           ASCII (SUBSTR (t, LEVEL, 1))     AS ascii_val
      FROM test_text
CONNECT BY LEVEL <= LENGTH (t);



              T    CHAR_POSITION    THIS_CHAR    ASCII_VAL
_______________ ________________ ____________ ____________
Test -û Text                   1 T                      84
Test -û Text                   2 e                     101
Test -û Text                   3 s                     115
Test -û Text                   4 t                     116
Test -û Text                   5                        32
Test -û Text                   6 -                      45
Test -û Text                   7 û                14844051
Test -û Text                   8                        32
Test -û Text                   9 T                      84
Test -û Text                  10 e                     101
Test -û Text                  11 x                     120
Test -û Text                  12 t                     116

【讨论】:

这是很有价值的信息,但我该如何解决我的问题 如果字符不是连字符,您可以在导出过程中使用REPLACE(text_col, chr(14844051), '-') 之类的方式处理该字符,或者清理表/列/行中的数据。有问题的字符的 ASCII 值可能与我在示例中提供的不同,具体取决于数据库使用的字符集。【参考方案2】:

正如https://***.com/users/7110099/ej-egyed 所说,您可能在数据中没有真正的“破折号”。如果您知道您的数据都是 UTF-8 格式,那么您可能只需要让数据正确显示即可。首先是检查您的终端是否支持并设置为 UTF-8,例如遵循此处的一些建议:https://serverfault.com/questions/13898/how-to-find-out-if-a-terminal-supports-utf-8 如果您的终端可以满足要求,假设您使用的是 sqlplus,您可能需要告诉它您更喜欢带有 NLS_LANG 环境变量的 UTF-8 输出。例如,

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

(具体设置取决于您的语言环境)。 不幸的是,您的数据也可能不是 UTF-8 格式(Windows 客户端可能使用“Windows Codepage 1252”之类的格式)。如果是这种情况,您首先需要弄清楚它所在的字符集,然后决定是尝试将其转换为 UTF-8 还是尝试让您的显示器在现有代码集中正确显示。

【讨论】:

以上是关于将数据从 oracle sql plus 导出到 csv 时,Hypen 转换为问号的主要内容,如果未能解决你的问题,请参考以下文章

oracle的数据怎么发送到接口

从远程服务器将Oracle数据库导出到本地Oracle数据库的方法

将数据从 Oracle 导出到 Excel - 性能问题

Oracle SQL*Plus 数据备份为 sql 文件

导出为插入语句:但在 SQL Plus 中,该行覆盖了 2500 个字符!

Python SQL*Plus 子进程错误:sgslunUDPNew:无法创建通信端点