2
votes

Dans Couchbase Java Query DSL, comment filtrer les valeurs de champ qui ne sont pas ASCII?

En utilisant Couchbase Java DSL, une requête utilisant "fish / piraña" donne une erreur d'analyse, mais avec "fish / piranha" , il n'y a pas d'analyse -Erreur.

J'avais pensé que la méthode x () envelopperait correctement la chaîne Unicode non-ASCII.

En utilisant N1ql directement, cela fonctionne avec n'importe quel nom de champ (sauf vide ) ou valeur du champ:

paramétré ("SELECT * from " + bucket.name () + " WHERE " + fieldName + " = $ v ", espaces réservés))

Comment cela peut-il être fait en utilisant le 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);


2 commentaires

J'ai eu la même erreur. Je vais demander en interne et revenir vers vous demain


Cela peut avoir quelque chose à voir avec la nécessité d'échapper / de citer / de paramétrer des valeurs


3 Réponses :


0
votes

La documentation indique qu'elle prend en charge l'unicode.

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

Les chaînes peuvent être des caractères Unicode ou des caractères d'échappement.


3 commentaires

C'est exactement ma question - pourquoi cela ne fonctionne-t-il pas?


Eh bien, l'une de vos questions est de savoir s'il prend en charge non ascii 😉


C'est la documentation, mais en pratique, ça ne marche pas



0
votes

Les chaînes Json peuvent avoir des caractères Unicode.

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

Le classement (ORDER BY, indexation, ....) et la comparaison des types de données sont basés sur une comparaison d'octets non basée sur un caractère Unicode. Si le caractère unicode est à un octet / fixe, cela fonctionnera, mais si les données sont variables, plusieurs octets peuvent ne pas fonctionner car la comparaison est basée sur une comparaison d'octets.


1 commentaires

Ok, mais alors comment puis-je rechercher des chaînes comme "piraña"?



2
votes

Donc, cela fonctionne via 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));

J'essaie toujours de comprendre le comportement via le SDK, je mettrai à jour cette réponse dès que je trouverai le problème.


4 commentaires

Une autre question est stackoverflow.com/questions/55338567 - celle-ci concerne les identifiants ASCII, tandis que celle-ci concerne Unicode non ASCII .


En outre, cette question concerne les valeurs de champ, tandis que cette question concerne les noms de champ


merci pour votre recherche. Veuillez étudier comment gérer non seulement les valeurs de champ mais aussi les noms de champ; et j'aimerais utiliser des espaces réservés pour les valeurs et les noms pour les raisons de sécurité habituelles.


@deniswrosa Cela semble le faire (en utilisant BACKTICK puisque Stackoverflow interprète les backticks réels comme du balisage.) select ("*"). from (i (bucket.name ())). where (x (BACKTICK + fieldNam‌ e + BACKTICK) .eq (x ("$ v‌ aleur"))