【问题标题】:Oracle data is returned with spaces between charactersOracle 数据返回字符之间有空格
【发布时间】:2018-06-11 16:34:33
【问题描述】:

我正在尝试使用 dblinks 从 SQL Server 数据库检索数据(选择 *..)到 Oracle 数据库。在我的 SQL Server 数据库中,我有 nvarchar 类型的列 AddressLine1AddressLine2

我正在 SQL Developer (v 4.1.3.20) 中运行以下脚本。结果似乎在字符之间有空格。我用的是 Benthic 和 SQL Plus,结果是一样的,字符之间有空格。

SELECT 
    c.CandidateID,
    pa."AddressLine1", pa."AddressLine2"
FROM 
    CANDIDATES c --Oracle table
INNER JOIN 
    PostalAddress@HIM pa ON pa."EntityID" = c.CandidateID   -- SQL Server table

--@HIM --dblink 名称`

此截图显示结果(复制时复制空格时):

我也尝试将结果转换为varchar,结果是一样的。我尝试修剪空格并尝试用 NULL 替换空格,但结果保持不变。

任何建议将不胜感激。谢谢。

【问题讨论】:

  • 那么您是在寻找导入方面的修复方法,还是寻找可以删除无关空格的查询?
  • 如果我不得不猜测我会猜测字符集问题。您的 oracle 实例和 sql 服务器的字符集是什么? NVARCHAR 表示它不会进行字符集转换
  • @TimBiegeleisen 我想知道是什么导致了这个问题。删除额外空格的查询将不胜感激。如前所述,我尝试使用 trim、to_char、regex_replace、replace 函数但没有用。
  • @PeterM 对于 Oracle,它是 AL16UTF16,sql server 排序规则是 SQL_Latin1_General_CP1_CI_AS。
  • 试试转换功能——它可能有用吗?从选项卡中选择 convert(address1,'AL16UTF16') - 这有什么不同吗?您在 oracle 中的列是 VARCHAR2 还是 NVARCHAR2?

标签: sql-server oracle dblink


【解决方案1】:

您的问题实际上似乎与编码有关。具体来说,您的文本似乎正在使用宽度为两个字节的字符集进行解码,但您的 ASCII 数据只占用一个字节。

作为临时修复,请考虑以下查询:

SELECT REGEXP_REPLACE('6 2 1 1  W r i g h t s v i l l e  A v e', ' ([^ ])', '\1')
FROM dual;

Demo

这会输出6211 Wrightsville Ave,这就是你想要的。请注意,我假设每个字符都有一个额外的幽​​灵空间,其结果是原来由一个空格分隔的单词现在被两个空格分隔。

这不是最好的解决方案,原因有很多。从正则表达式的角度来看,可以使用环视给出更严格的答案,但REGEXP_REPLACE 似乎不支持它们。

【讨论】:

    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2011-12-18
    • 2014-03-18
    • 2023-04-05
    相关资源
    最近更新 更多