Как в Couchbase Java Query DSL фильтровать значения полей, которые не являются ASCII? - PullRequest
2 голосов
/ 24 марта 2019

Используя Couchbase Java DSL, запрос с использованием "fish/piraña" дает ошибку синтаксического анализа, но с "fish/piranha" ошибка синтаксического анализа отсутствует.

Я думал, что метод x() будет правильно переносить строку в кодировке не-ASCII Unicode.

При непосредственном использовании N1ql это работает с любым именем поля (кроме пустого) или значением поля:

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

Как это можно сделать с помощью Java Query 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 ]

2 голосов
/ 25 марта 2019

Итак, он работает через 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, я обновлю этот ответ, как только найду проблему.

0 голосов
/ 24 марта 2019

Строки Json могут содержать символы Юникода.

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, indexing, ....) и сравнение типов данных основано на сравнении байтов, а не на символе юникода. Если символ Юникода представляет собой один / фиксированный байт, он будет работать, но если данные являются переменными, многобайтовые данные могут не работать, поскольку сравнение основано на сравнении байтов.

0 голосов
/ 24 марта 2019

Документация гласит, что поддерживает юникод.

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

Строки могут быть либо символами Unicode, либо экранированными.

...