java - 为什么使用十六进制文字的 Cassandra cql 查询有效,但 textAsBinary 无效?

标签 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 时犯了什么错误?

最佳答案

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/

相关文章:

java - 自定义 View ,将它们动态插入到 Java 中的布局中

java - 在Java中将变量添加到sql语句中

java - 如何使 JUnit 测试用例按顺序运行?

当我运行任何查询时,Cassandra 会显示三个点

c++ - 将文件中的十六进制数转换为 ASCII

c# - BigInteger 到十六进制

java - 排序算法 - 如何在 main :) 中实现我的类

nosql - 关于一致性级别的 Cassandra 写入性能

cassandra - 使用 dsbulk 在 cassandra 中加载数据时出现问题

java - java中如何将int转换为十六进制颜色格式