如何在Cassandra cql中使用条件select声明一些数据,包括字符“\t”

how to use condition select statement some data including character "\t" in Cassandra cql

我使用 datastax 库和 spring 框架向 Cassandra table 插入数据

我使用分隔符“\t”来连接两个字符串 this.pid + "\t" + this.cid;

如果我select插入数据,我可以看到数据已保存

select * from table1;

 pid | cid       | key  | value | update_time
-----+-----------+------+-------+--------------------------
  1 | data1 | key1 | 01\tdata1 | 2019-xx-xx 
  2 | data2 | key2 | 02\tdata2 | 2019-xx-xx 

但我不能 select 使用 select 语句

的数据

select * 来自 table1 其中 pid=1 AND cid='data1' AND key='key1' AND value='1\tdata1';

我应该转义 '\t' 字符吗?

下面是table方案

CREATE TABLE table1 (
    pid int,
    cid text,
    key text,
    value text,
    update_time timestamp,
    PRIMARY KEY (pid, cid, key, value)
)

cql插入的数据和java有区别

我使用Mac OS,当我在Mac控制台上select时,我可以看到“\t”字符颜色不同

使用java

插入数据

enter image description here

使用cql插入数据

enter image description here

您正在使用 pid 作为字符串,但它是一个整数 - 尝试下面的查询,它会起作用 -

select * 来自表 1,其中 pid=1 AND cid='data1' AND key='key1' AND value='01\tdata1';

您已经在其中一条评论中回答了自己,但为了后代,我想解释一下发生了什么:

首先,您正在使用 "cqlsh" 工具执行 SELECT 请求。该工具试图通过将不可打印的字符转换为传统的 Unix 表示形式(例如,参见 "cat -v")来实现友好,例如制表符在打印时被转换为“\t”。但实际存入数据库的字符是制表符(ASCII值为9的字符),而不是“\t”。

第二件事是CQL本身不支持这些"escaped"字符。 \t 或 \011 之类的东西在 CQL 中没有任何特殊含义,“\t”只是两个字符反斜杠和 t!您需要在查询字符串中使用实际的制表符。在 Java 代码(或其他现代语言)中,这很容易,您可以在字符串常量中使用 \t 并且 Java(不是 Cassandra)会将其转换为该查询字符串中的实际制表符。但是,如果您使用 cqlsh 进行查询,则没有人会为您进行此转换;您需要实际键入该选项卡。因为 cqlsh 对制表符有特殊处理,您需要使用 control-V 和 tab 来告诉 cqlsh 真正放置一个实际的制表符。我看到你自己已经发现了这个解决方案。