我可以使用十六进制文字执行 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 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
关于java - 为什么使用十六进制文字的 Cassandra cql 查询有效,但 textAsBinary 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31994880/