无法通过UUID RAW查找数据库中的行(32)

时间:2011-10-07 17:51:15

标签: sql database oracle oracle11g

我有下表:

create table Mike_Test
( Id          raw(32)      default sys_guid() not null primary key,
  Value        varchar2(80) not null unique
);

我现在插入此表:

INSERT INTO Mike_Test (VALUE) VALUES ('Blah');

我可以确认那里有一个新行:

select * from Mike_Test;

我明白了:

08364fc81419429d83c9bcedb24a9a57    Blah

现在我尝试用以下方法选择该行:

select * from Mike_Test WHERE ID='08364fc81419429d83c9bcedb24a9a57';

但是,我得到零行和零错误。我做错了什么?

4 个答案:

答案 0 :(得分:9)

这是一种RAW数据类型,你必须这样查询:

select .... where id=hextoraw('08364fc81419429d83c9bcedb24a9a57') ....

答案 1 :(得分:4)

我认为您可能需要在ID值周围使用HEXTORAW函数。此函数将十六进制字符串转换为相应的RAW值。

换句话说,您的查询应如下所示:

select * from Mike_Test WHERE ID=HEXTORAW('08364fc81419429d83c9bcedb24a9a57');

答案 2 :(得分:3)

嘿,我做了一些更多的玩弄,答案很愚蠢。似乎Oracle会隐式地将一个字符串强制转换为GUID(就像正常人类所期望的那样),但是强制转换是区分大小写的!如果你正在解析十六进制数并且套管与你的基数无关,那么这绝对没有意义。这让我失望的原因是因为我使用的是Aqua Data Studio,它出于某种原因显示所有小写的GUID。

以下内容来自SQLPlus,它正确处理输出:

SQL> select * from Mike_Test;

ID
--------------------------------
VALUE
--------------------------------------------------------------------------------
4FBD50C370BC4A7F85E3DF034D120930
Blah


SQL> select * from Mike_Test WHERE ID='4fbd50c370bc4a7f85e3df034d120930';

no rows selected

SQL> select * from Mike_Test WHERE ID='4FBD50C370BC4A7F85E3DF034D120930';

ID
--------------------------------
VALUE
--------------------------------------------------------------------------------
4FBD50C370BC4A7F85E3DF034D120930
Blah

我发誓,每天使用它都会变得更加愚蠢。我发誓。

答案 3 :(得分:1)

添加到我的答案(我不想编辑我的原始答案,因为这是一个切线):

我试图做的隐式演员和推荐的HEXTORAW方法之间存在巨大的性能差异。隐式转换的查询计划类似于:

SELECT STATEMENT    3.0 3   37877   1   52  3                   ALL_ROWS                                            
TABLE ACCESS (FULL) 3.0 3   37877   1   52  1   TPMDBO  MIKE_TEST   FULL    TABLE       1

HEXTORAW是:

SELECT STATEMENT    1.0 1   15463   1   52  1                   ALL_ROWS                                            
TABLE ACCESS (BY INDEX ROWID)   1.0 1   15463   1   52  1   TPMDBO  MIKE_TEST   BY INDEX ROWID  TABLE       1                                       
INDEX (UNIQUE SCAN) 1.0 1   8171    1       1   TPMDBO  SYS_C007969 UNIQUE SCAN INDEX (UNIQUE)                  1                           

如您所见,HEXTORAW方法将触及表中的主键索引。这是因为隐式转换将遵循右操作数(我指定的GUID)的“字符串”类型,并将数据库中的所有GUID转换为字符串。绝对值得考虑的事情。