我使用datastax库和spring框架将数据插入Cassandra表中
我使用分隔符“ \ t”连接两个字符串 this.pid +“ \ t” + this.cid;
如果选择插入的数据,则可以看到已保存数据
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语句选择该数据
从table1中选择*,其中pid = 1 AND cid ='data1'AND key ='key1'AND value ='1 \ tdata1';
我应该转义'\ t'字符吗?
下面是表格方案
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控制台上选择时,我看到“ \ t”字符颜色不同
使用Java插入数据
使用cql插入数据
答案 0 :(得分:0)
您已经在其中一条评论中回答了自己,但是为了后代,我想解释一下发生了什么
首先,您正在使用“ cqlsh”工具执行SELECT请求。该工具通过将不可打印的字符转换为传统的Unix表示(例如,参见“ cat -v”)来尝试友好,因此例如在打印时将制表符转换为“ \ t”。但是存储在数据库中的实际字符是制表符(ASCII值为9的字符),而不是“ \ t”。
第二件事是CQL本身不支持这些“转义”字符。 \ t或\ 011之类的东西在CQL中没有任何特殊含义,“ \ t”只是两个字符反斜杠和t!您需要在查询字符串中使用实际的制表符。在Java代码(或其他现代语言)中,很容易,您可以在字符串常量中使用\ t,而Java(不是Cassandra)会将其转换为该查询字符串中的实际选项卡。但是,如果您使用cqlsh进行查询,则没有人会为您进行此转换。您实际上需要输入该标签。由于cqlsh对制表符有特殊处理,因此您需要使用control-V和tab来告诉cqlsh真正放置一个实际的制表符。我看到您已经自己发现了此解决方案。
答案 1 :(得分:-1)