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