Oracle 针对 SQL Server 数据库的查询给出不一致的结果

Lei*_*fel 5 sql-server-2008 oracle sql-server query oracle-11g-r2

我们有多个 Oracle 11.2.0.2 数据库,其中 og4odbc 数据库链接到 SQL Server 2008 数据库。SQL Server 数据库中的特定表有两个 Varchar(36) 列。以下语句返回 1292 行:

select "id", "folder_id" from dbo.mediasite_presentation@ms;
Run Code Online (Sandbox Code Playgroud)

查询第一列中的特定值会返回一行:

select "id", "folder_id" from dbo.mediasite_presentation@ms 
   where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
id                                   folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0
Run Code Online (Sandbox Code Playgroud)

但是查询第二列中的特定值不返回任何行:

select "id", "folder_id" from dbo.mediasite_presentation@ms 
   where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0';
no rows selected
Run Code Online (Sandbox Code Playgroud)

使用有效的 where 子句并将每个字段包装在 to_char 中会返回以下有趣的结果:

select to_char("id"), to_char("folder_id") from dbo.mediasite_presentation@ms 
   where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
TO_CHAR("ID")                        TO_CHAR("FOLDER_ID")
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ??????????????????
Run Code Online (Sandbox Code Playgroud)

有趣的是,我只需添加一个 rownum 子句就可以产生相同的结果:

select "id", "folder_id" from dbo.mediasite_presentation@ms 
   where "id"='006d815d-6e9e-4004-9104-51213a1ecd52' and rownum<=1;

id                                   folder_id
------------------------------------ ------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ??????????????????
Run Code Online (Sandbox Code Playgroud)

更奇怪的是,为不返回数据的查询创建物化视图实际上返回了数据。

Create Materialized View TempMV as (
   select "id", "folder_id" from dbo.mediasite_presentation@ms 
      where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0' and rownum<=1);
Materialized view created.
select * from TempMV;

id                                   folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0
Run Code Online (Sandbox Code Playgroud)

即使您只能解释这个难题的一部分,也请回答。

Gar*_*ary 4

我怀疑一些字符集转换问题。\n当您执行 TO_CHAR 时,您将返回“\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2 \x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94 \x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90\xe2\x94\x90"(18 个字符)。这表明对于列中包含的数据是单字节还是多字节存在一些混淆。

\n\n

“SQL Server 中的 uniqueidentifier 数据类型本身存储为 16 字节二进制值”\n理想情况下,Oracle 应该将其视为 RAW 数据类型,而不是 VARCHAR2 或 CHAR。

\n\n

如果你做一个

\n\n
CREATE VIEW temp_view as select  "id", "folder_id" from dbo.mediasite_presentation@ms\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您执行 DESC temp_view 时会显示什么

\n