在Couchbase Java查询DSL中,如何过滤非ASCII的字段值?

时间:2019-03-24 10:49:58

标签: unicode couchbase n1ql

使用Couchbase Java DSL,使用"fish/piraña"进行的查询会产生解析错误,但是使用"fish/piranha"不会出现解析错误。

我曾经认为x()方法会正确包装非ASCII Unicode字符串。

直接使用N1ql,它适用于任何字段名称(空白除外)或字段值:

parameterized("SELECT * from“ + bucket.name()+” WHERE“ + fieldName +” = $v", placeholders))

如何使用Java查询DSL完成此操作?

    String species "fish/pira\u00f1a" ;
    Expression expForType = x("species").eq(x(species));
    OffsetPath statement = select("*").from(i(bucket.name())).where(expForType);
    N1qlQuery q = N1qlQuery.simple(statement);
    N1qlQueryResult result = bucket.query(q);

3 个答案:

答案 0 :(得分:2)

因此,它通过N1QL起作用:

   N1qlParams params = N1qlParams.build().consistency(ScanConsistency.REQUEST_PLUS).adhoc(true);
   ParameterizedN1qlQuery query = N1qlQuery.parameterized("Select * from `quicktask` where species = 'fish/pira\u00f1a' ", JsonObject.create(), params);
   System.out.println(quickProcessHistoryRepository.getCouchbaseOperations().getCouchbaseBucket().query(query));

我仍在尝试通过SDK了解行为,一旦发现问题,我将立即更新此答案。

答案 1 :(得分:0)

文档说它支持unicode。

https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/literals.html

  

字符串可以是Unicode字符或转义字符。

答案 2 :(得分:0)

Json字符串可以包含unicode字符。

insert into default values ("f1",{"name":"fish/pira\u00f1a"});
select * from default where name = "fish/pira\u00f1a";
 "results": [
    {
        "default": {
            "name": "fish/piraña"
        }
    }
    ]

排序规则(ORDER BY,索引等等)和数据类型比较基于字节比较,而不是基于unicode字符。如果unicode字符是单个/固定字节,它将起作用,但是如果数据是可变的,则多字节可能不起作用,因为比较是基于字节比较的。