Unicode 在Couchbase Java查询DSL中,如何筛选非ASCII字段值?

Unicode 在Couchbase Java查询DSL中,如何筛选非ASCII字段值?,unicode,couchbase,n1ql,Unicode,Couchbase,N1ql,使用Couchbase Java DSL,使用fish/piraña的查询会给出一个解析错误,但是使用fish/piranha时,没有解析错误 我原以为x方法可以正确地包装非ASCII Unicode字符串 直接使用N1ql时,除空白或字段值外,这不适用于任何字段名: parameterizedSELECT*from+bucket.name+WHERE+fieldName+=$v,占位符 如何使用Java查询DSL实现这一点 String species "fish/pira\u00f1

使用Couchbase Java DSL,使用fish/piraña的查询会给出一个解析错误,但是使用fish/piranha时,没有解析错误

我原以为x方法可以正确地包装非ASCII Unicode字符串

直接使用N1ql时,除空白或字段值外,这不适用于任何字段名:

parameterizedSELECT*from+bucket.name+WHERE+fieldName+=$v,占位符

如何使用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);


文档中说它支持unicode

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

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

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"
        }
    }
    ]
排序规则排序依据、索引等。。。。数据类型比较基于字节比较,而不是基于unicode字符。如果unicode字符是单字节/固定字节,则可以工作,但如果数据是可变的,则多字节可能无法工作,因为比较是基于字节比较的。

因此,它通过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了解其行为,一旦发现问题,我将立即更新此答案。

我遇到了相同的错误。我会在内部询问,明天再回复您。这可能与转义/引用/参数化值的需要有关。这正是我的问题-为什么不起作用?您的一个问题是,它是否支持非ascii文档,但实际上,它不起作用,但是,我如何查询像piraña这样的字符串呢?另一个问题是-这个问题与ASCII标识符有关,而这个问题与非ASCII Unicode有关。另外,这个问题是关于字段值的,而这个问题是关于字段名称的。谢谢您研究这个问题。请调查如何处理字段值和字段名称;出于通常的安全原因,我想对值和名称使用占位符。@deniswrosa这似乎是使用BACKTICK实现的,因为Stackoverflow将实际的BACKTICK解释为标记。选择*.fromibucket.name.wherexBACKTICK+fieldName+BACKTICK.eqx$value