La manipulation de l'Unicode des séquences dans postgresql

J'ai quelques JSON données stockées dans un JSON (pas JSONB) colonne dans ma base de données postgresql (9.4.1). Certains de ces JSON contiennent des structures de l'unicode des séquences dans leurs valeurs d'attribut. Par exemple:

{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }

Quand j'essaie de requête JSON colonne (même si je ne suis pas directement en essayant d'accéder à la device_name attribut), j'obtiens l'erreur suivante:

ERREUR: non pris en charge séquence d'échappement Unicode

Détail: \u0000 ne peuvent être converties en texte.

Vous pouvez recréer cette erreur en exécutant la commande suivante sur un serveur postgresql:

select '{"client_id": 1, "device_name": "FooBar\ufffd\u0000\ufffd\u000f\ufffd" }'::json->>'client_id'

L'erreur fait sens pour moi - il n'y a tout simplement aucun moyen de représenter la séquence unicode NULL dans un résultat textuel.

Est-il de toute façon pour moi de m'interroger les mêmes données JSON sans avoir à effectuer un "assainissement" sur les données entrantes? Ces JSON structures de changer régulièrement de la numérisation d'un attribut spécifique (device_name dans ce cas) ne serait pas une bonne solution car il pourrait facilement y avoir d'autres attributs qui pourrait détenir des données similaires.


Après quelques investigations, il semble que ce comportement est nouveau pour la version 9.4.1 comme mentionné dans le changelog:

...Donc \u0000 sera désormais également être rejeté en json valeurs lors de la conversion de caractères d'échappement de forme est nécessaire. Ce changement ne se casse pas la capacité à stocker \u0000 en json colonnes aussi longtemps qu'aucun traitement n'est effectué sur les valeurs...

Était-ce vraiment l'intention? Est d'une décote de pré 9.4.1 une option viable ici?



Comme une note de côté, cette propriété est tiré du nom du client mobile de l'appareil - c'est l'utilisateur qui est entré dans ce texte dans l'appareil. Comment sur la terre n'a un utilisateur d'insérer NULL et CARACTÈRE de REMPLACEMENT valeurs?!

  • Pour référence, ce n'est pas seulement le cas avec les SELECT - je obtenir le même problème avec un SQL UPDATE déclaration sur 9.5 et 9.6.
  • Pour info, j'ai couru le SELECT que vous avez fourni sur un PostgreSQL 10.1, compilé par Visual C++ construire 1800, 32-bit et il a renvoyé la même erreur.
InformationsquelleAutor Lix | 2015-07-28