我可以使用十六进制文字进行cassandra cql查询,但是当我尝试使用textAsBlob时它不起作用

例如,以下工作正常:

cqlsh:sprich> SELECT * FROM "STOCK_CHECK_RTAM_ITEM_INDEX" WHERE key in (0x3631313230);

 key          | column1        | value

--------------+----------------+------------------------------------

0x3631313230 | 0x000330303100 | 0xf77374b5eced11e3a877005056b37d30

 0x3631313230 | 0x000330303200 | 0xf7757084eced11e3a877005056b37d30

 0x3631313230 | 0x000330303400 | 0xf7712ac8eced11e3a877005056b37d30


但是以下两个查询不会:

cqlsh:sprich> SELECT * FROM "STOCK_CHECK_RTAM_ITEM_INDEX" WHERE key in (textAsBlob("0x3631313230"));

Bad Request: line 1:84 missing EOF at ')'
text could not be lexed at line 1, char 15

cqlsh:sprich> SELECT * FROM "STOCK_CHECK_RTAM_ITEM_INDEX" WHERE key in (textAsBlob("3631313230"));
Bad Request: line 1:82 missing EOF at ')'
text could not be lexed at line 1, char 15


以下两个查询不会给出语法错误,但也不会返回正确的结果:

cqlsh:sprich> SELECT * FROM "STOCK_CHECK_RTAM_ITEM_INDEX" WHERE key in (textAsBlob('0x3631313230'));

cqlsh:sprich> SELECT * FROM "STOCK_CHECK_RTAM_ITEM_INDEX" WHERE key in (textAsBlob('3631313230'));


为什么textAsBlob无法正常工作?我在正确使用textAsBlob时犯了什么错误?

最佳答案

Cassandra用十六进制数表示blob数据类型,例如0x3631313230

这与文本数据类型(用单引号引起来)不同,例如'0x3631313230'

由于这些原因,在您的陈述中:


textAsBlob不起作用,因为它期望用单引号引起来的字符串。
当您使用单引号时,由于0x3631313230'0x3631313230'不同,因此它不会返回正确的结果。


在下面的示例中,您可以清楚地看到它。假设:

CREATE TABLE test(b blob, t text, PRIMARY KEY(b));


现在执行以下INSERT:

INSERT INTO test(b,t) VALUES(0x3631313230, blobAsText(0x3631313230));


当您执行SELECT时,将返回以下内容:

b             |  t
0x3631313230  |  61120


如您所见,0x3631313230不等同于'0x3631313230',这就是为什么应该使用第一个查询来获得正确结果的原因:

SELECT * FROM "STOCK_CHECK_RTAM_ITEM_INDEX" WHERE key in (0x3631313230);


这是参考:

http://docs.datastax.com/en/cql/3.3/cql/cql_reference/cql_data_types_c.html

09-05 20:12