我可以使用十六进制文字进行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