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);
3 Réponses :
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.
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
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.
Ok, mais alors comment puis-je rechercher des chaînes comme "piraña"?
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.
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"))
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