如何使用条件选择语句在cassandra cql中包含字符“\t”的一些数据

iszxjhcz  于 2021-06-10  发布在  Cassandra
关注(0)|答案(2)|浏览(465)

我使用datastax库和spring框架将数据插入cassandra表
我使用分隔符“\t”连接两个字符串this.pid+“\t”+this.cid;
如果选择inserted data,则可以看到数据已保存

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语句选择那个数据
从表1中选择*,其中pid=1,cid='data1',key='key1',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插入数据
在此处输入图像描述

bfhwhh0e

bfhwhh0e1#

你已经在其中一条评论中回答了自己,但为了子孙后代,我想解释一下发生了什么:
首先,您使用“cqlsh”工具来执行select请求。这个工具试图通过将不可打印的字符转换成传统的unix表示形式(例如,请参见“cat-v”)来保持友好,例如,在打印时制表符被转换为“\t”。但数据库中存储的实际字符是制表符(ascii值为9的字符),而不是“\t”。
第二件事是cql本身不支持这些“转义”字符。像\t或\011这样的东西在cql中没有任何特殊意义,“\t”只是两个字符反斜杠和t!您需要在查询字符串中使用实际的制表符。在java代码(或其他现代语言)中,这很简单,您可以在字符串常量中使用\t,java(不是cassandra)将其转换为查询字符串中的实际选项卡。但是如果您使用cqlsh进行查询,没有人会为您进行这种转换;你需要实际键入该选项卡。因为cqlsh对tab有特殊的处理,所以需要使用control-v和tab来告诉cqlsh真正放置一个实际的tab。我看你自己已经找到了这个解决办法。

falq053o

falq053o2#

您正在使用pid作为字符串,但这是一个整数-请尝试下面的查询,它将工作-
从表1中选择*,其中pid=1,cid='data1',key='key1',value='01\tdata1';

相关问题