2015-04-07 72 views
1

您好我有在卡桑德拉分贝的ColumnFamily和当我检查表的内容中,示出不同地卡桑德拉CQL2:无法更新列

./cqlsh -2 
select * from table1; 

KEY,31281881-1bef-447a-88cf-a227dae821d6 | A,0xaa| Cidr,10.10.12.0/24 | B,0xac | C,0x01 | Ip,10.10.12.1 | D,0x00000000 | E,0xace | F,0x00000000 | G,0x7375626e657431 | H,0x666230363 | I,0x00 | J,0x353839 

使用时虽然输出是作为本作

./cqlsh -3 
select * from table1; 

key         | Cidr   | Ip 
--------------------------------------+---------------+------------ 
31281881-1bef-447a-88cf-a227dae821d6 | 10.10.12.0/24 | 10.10.12.1 

该值是使用java程序运行插入的。

我想假设只有在数据库中手动使用-2选项时才会看到coulmn“B”的更新值,它给了我错误,它是十六进制值。 我使用这个命令来更新,但总是得到错误

cqlsh:sdnctl_db> update table1 SET B='0x7375626e657431' where key='31281881-1bef-447a-88cf-a227dae821d6';

Bad Request: cannot parse '0x7375626e657431' as hex bytes

cqlsh:sdnctl_db> update table1 SET B=0x7375626e657431 where key='31281881-1bef-447a-88cf-a227dae821d6';

Bad Request: line 1:30 no viable alternative at input 'x7375626e657431'

cqlsh:sdnctl_db> update table1 SET B=7375626e657431 where key='31281881-1bef-447a-88cf-a227dae821d6';

Bad Request: line 1:37 mismatched character '6' expecting '-'

我需要插入的十六进制值仅会被应用程序所回升,但无法插入。

请帮助我纠正语法。

回答

0

这取决于列B具有的数据类型。 Here is the reference of the CQL data types.该文档说blob数据表示为一个十六进制字符串,所以我的假设是您的列B也是一个blob。从this other cassandra question (and answer)您可以看到如何将字符串插入到斑点中。

cqlsh:so> CREATE TABLE test (a blob, b int, PRIMARY KEY (b)); 
cqlsh:so> INSERT INTO test(a,b) VALUES (textAsBlob('a'), 0); 
cqlsh:so> SELECT * FROM test; 

b | a 
---+------ 
0 | 0x61 
cqlsh:so> UPDATE test SET a = textASBlob('b') WHERE b = 0; 
cqlsh:so> SELECT * FROM test; 

b | a 
---+------ 
0 | 0x62 

在你的情况,你可以在你的十六进制字符串转换为代码中一个字符串,然后用cqlsh的textAsBlob功能。

如果B列的数据类型是int而不是在执行插入前将十六进制数转换为int?

+0

这些命令工作完全使用CQL 3.0 但问题是,我想编辑使用CQL 2只中出现的数据或通过附加“-2”选项与cqlsh 想我现在开始-2选项,检查内容的测试表,他们是如下关于 [cqlsh 2.3.0 | Cassandra 0.0.0 | CQL规范2.0.0 | Thrift协议19.35.0] 使用帮助寻求帮助。 cqlsh>使用如此; cqlsh:so> SELECT * FROM test; b | '\ x00 \ x00 \ x00'| '\ x00 \ x01a \ x00' --- + ---------------- + ----------------- 0 | 0x | 0x62 – tarun

+0

现在更新它并添加另一个coulmn作为 cqlsh:so> update test set x =''其中b = 0; cqlsh:so> SELECT * FROM test; b | '\ x00 \ x00 \ x00'| '\ x00 \ x01a \ x00'| '\ x00 \ x01x \ x00' --- + ---------------- + ----------------- + - --------------- 0 | 0x | 0x62 | 0x 但是这个命令失败如下 cqlsh:so> update test set x = textAsBlob('5')where b = 0; (' cqlsh:sdnctl_db>更新测试集x = 5其中b = 0; 错误请求:无法以十六进制字节解析'5' – tarun

+0

[参考blob in cassandra 1.2](http://docs.datastax.com/en/cql/3.0/cql/cql_reference/blob_r.html)提到'set col = 0xABC123'命令应该可以工作,但是其他几个网站都说cqlsh v2已被弃用,您应该转移到v3。我知道这并不回答你的问题,但我不能真正在我的机器上测试它:'cqlsh:error:'2.0.0'不是支持的CQL版本.' – csima