ScyllaDB-[无效查询] message =“封送处理错误:毫秒长度超出预期(6)”

ell*_*lli 8 cql cassandra scylla

我有一个带有timestamp类型列的表,当我插入一个值时,Sylla会用3个零以上的值保存它。

根据Scylla文档(https://docs.scylladb.com/getting-started/types/#timestamps):

可以使用其值作为整数或使用代表ISO 8601日期的字符串在CQL中输入时间戳。例如,以下所有值都是2011年3月2日格林尼治标准时间04:05:00的有效时间戳记值:

  • 1299038700000
  • '2011-02-03 04:05 + 0000'
  • '2011-02-03 04:05:00 + 0000'
  • '2011-02-03 04:05:00.000 + 0000'
  • '2011-02-03T04:05 + 0000'
  • '2011-02-03T04:05:00 + 0000'
  • '2011-02-03T04:05:00.000 + 0000'

因此,例如,当我创建一个表时:

CREATE TABLE callers (phone text, timestamp timestamp, callID text, PRIMARY KEY(phone, timestamp));
Run Code Online (Sandbox Code Playgroud)

并将值插入其中:

INSERT INTO callers (phone, timestamp, callID) VALUES ('6978311845', 1299038700000, '123');
INSERT INTO callers (phone, timestamp, callID) VALUES ('6978311846', '2011-02-03 04:05+0000', '456');
INSERT INTO callers (phone, timestamp, callID) VALUES ('6978311847', '2011-02-03 04:05:00.000+0000', '789');
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM callers;将显示更多的点后3个零所有时间戳:

 phone      | timestamp                       | callid
------------+---------------------------------+--------
 6978311847 | 2011-02-03 04:05:00.000000+0000 |    789
 6978311845 | 2011-03-02 04:05:00.000000+0000 |    123
 6978311846 | 2011-02-03 04:05:00.000000+0000 |    456
Run Code Online (Sandbox Code Playgroud)

结果,当我尝试例如删除一行时:

DELETE FROM callers WHERE phone = '6978311845' AND timestamp = '2011-03-02 04:05:00.000000+0000';
Run Code Online (Sandbox Code Playgroud)

发生错误:

InvalidRequest: Error from server: code=2200 [Invalid query] message="marshaling error: unable to parse date '2011-03-02 04:05:00.000000+0000': marshaling error: Milliseconds length exceeds expected (6)"
Run Code Online (Sandbox Code Playgroud)

如何存储时间戳而不会出现此错误?

Tom*_*San 3

你有 hr:min:sec.millisec -> Millisec 可以高达 999/1000 所以基本上这就是错误所说的。

您所做的3 条INSERT语句在语法方面是正确的。

DELETE声明的格式应与以下内容相同INSERT

  • AND timestamp = '2011-03-02 04:05:00.00+0000'
  • AND timestamp = '2011-03-02 04:05:00.000+0000'
  • AND timestamp = '2011-03-02 04:05:00+0000'
  • AND timestamp = '2011-03-02 04:05:00'

表中出现的附加内容000只是显示问题。