为什么Cassandra cql查询与十六进制文字工作,但textAsBinary不?

时间:2015-08-13 17:32:29

标签: java cassandra hex cql literals

我可以使用十六进制文字进行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时犯了什么错误?

1 个答案:

答案 0 :(得分:1)

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