在 Couchbase Java 查询 DSL 中,如何过滤非 ASCII 的字段值?
In Couchbase Java Query DSL, how do I filter for field-values that are not ASCII?
使用 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);
文档说它支持 unicode。
https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/literals.html
Strings can be either Unicode characters or escaped characters.
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 字符是 single/fixed 字节,它会起作用,但如果数据是可变的,多字节可能不起作用,因为比较是基于字节比较的。
所以,它通过 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 了解行为,我会在发现问题后立即更新此答案。
使用 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);
文档说它支持 unicode。
https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/literals.html
Strings can be either Unicode characters or escaped characters.
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 字符是 single/fixed 字节,它会起作用,但如果数据是可变的,多字节可能不起作用,因为比较是基于字节比较的。
所以,它通过 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 了解行为,我会在发现问题后立即更新此答案。