将数据从 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数据库的方法