Bug SQL quand le message contient des caractères spéciaux

Hello,

J’ai remarqué que le plugin ne fait pas de normalisation des caractères du message (ici à cause d’un apostrophe) avant l’enregistrement dans la base de Jeedom… Du coup, on a une méchante erreur SQL.

0004|[Tue Jan 17 14:53:52.900627 2023] [php7:error] [pid 19746] [client 127.0.0.1:39134] PHP Fatal error:  Uncaught Exception: [MySQL] Error code : 22007 (1366). Incorrect string value: '\xF0\x9F\x98\x89' for column `jeedom`.`history`.`value` at row 1  : REPLACE INTO history
0005|SET cmd_id=:cmd_id,
0006|`datetime`=:datetime,
0007|value=:value in /var/www/html/core/class/DB.class.php:102
0008|Stack trace:
0009|#0 /var/www/html/core/class/history.class.php(988): DB::Prepare('REPLACE INTO hi...', Array, 0)
0010|#1 /var/www/html/core/class/cmd.class.php(2296): history->save(Object(signalCmd))
0011|#2 /var/www/html/core/class/cmd.class.php(1782): cmd->addHistoryValue('**Tu vois qu'on p...**', '2023-01-17 14:5...')
0012|#3 /var/www/html/plugins/signal/core/php/jeeSignal.php(52): cmd->event('Tu vois qu'on p...', NULL)
0013|#4 {main}
0014|thrown in /var/www/html/core/class/DB.class.php on line 102

hello, pourrais tu préciser dans quelles circonstances?
C’est en réception?
tu pourrais mettre les logs en debug et me copier/coller les 2 lignes [WebSocket] Message reçu ... et la suivante Send data to jeedom ... en enlevant tes infos persos stp :wink:

ç’a m’aidera à voir d’où ça peut venir car en réception je n’ai aucun soucis

en envoi j’ai remarqué effectivement un soucis via l’envoi depuis le dashboard ça part pas si guillemet, mais c’est ok via scénario, j’avais dû faire une modif qui a entrainé le soucis ça fonctionnait avant et je n’avais pas retesté! mais ça ne génère pas d’erreur SQL

EDIT: je viens de faire une mise à jour du plugin en corrigeant le soucis que jai détecté, pourrais tu me dire si tu as toujours les problèmes ?

Hello,

Je viens de refaire des tests (d’abord sans mettre le plugin a jour, pour bien valider le problème), et ca ne plante pas juste avec un message contenant une simple apostrophe comme je le pensais.
en fait, j’ai envoyé un message avec du texte (avec une apostrophe et un smiley) ET une image.

Le log http.error :

0026|[Tue Jan 17 19:34:51.633868 2023] [php7:error] [pid 4195] [client 127.0.0.1:42970] PHP Fatal error:  Uncaught Exception: [MySQL] Error code : 22007 (1366). Incorrect string value: '\xF0\x9F\x98\x89' for column `jeedom`.`history`.`value` at row 1  : REPLACE INTO history
0027|SET cmd_id=:cmd_id,
0028|`datetime`=:datetime,
0029|value=:value in /var/www/html/core/class/DB.class.php:102
0030|Stack trace:
0031|#0 /var/www/html/core/class/history.class.php(988): DB::Prepare('REPLACE INTO hi...', Array, 0)
0032|#1 /var/www/html/core/class/cmd.class.php(2296): history->save(Object(signalCmd))
0033|#2 /var/www/html/core/class/cmd.class.php(1782): cmd->addHistoryValue('Tu vois qu'on p...', '2023-01-17 19:3...')
0034|#3 /var/www/html/plugins/signal/core/php/jeeSignal.php(52): cmd->event('Tu vois qu'on p...', NULL)
0035|#4 {main}
0036|thrown in /var/www/html/core/class/DB.class.php on line 102

Le log signal en debug :

[2023-01-17 15:28:07]ERROR : Error on send to jeedom : null
[2023-01-17 19:31:40]DEBUG : state courant: running
[2023-01-17 19:31:40]INFO : Lancement démon signal : sudo  /usr/bin/node /var/www/html/plugins/signal/resources/demond/signald.js --loglevel debug --socketport 55099 --signal_server 127.0.0.1:8099/v1/receive/+3366xxxx--callback http://127.0.0.1:80/plugins/signal/core/php/jeeSignal.php --apikey xxxx --cycle 0.3 --pid /tmp/jeedom/signal/deamon.pid
[2023-01-17 18:31:40]INFO : Start signal
[2023-01-17 18:31:40]INFO : Log level on  : debug
[2023-01-17 18:31:40]INFO : Socket port : 55099
[2023-01-17 18:31:40]INFO : Docker server : 127.0.0.1:8099/v1/receive/+336xxxx
[2023-01-17 18:31:40]INFO : PID file : /tmp/jeedom/signal/deamon.pid
[2023-01-17 18:31:40]INFO : Apikey : xxxx
[2023-01-17 18:31:40]INFO : Callback : http://127.0.0.1:80/plugins/signal/core/php/jeeSignal.php
[2023-01-17 18:31:40]INFO : Cycle : 0.3
[2023-01-17 18:31:40]INFO : Connect to signal server : ws://127.0.0.1:8099/v1/receive/+336xxxx
[2023-01-17 18:31:40]DEBUG : HTTP listen on 127.0.0.1 port : 55099 started
[2023-01-17 18:31:40]DEBUG : [WebSocket] Connexion au websocket signal-Api établie
[2023-01-17 18:34:51]DEBUG : [WebSocket] Message reçu: {"envelope":{"source":"+336xxxx","sourceNumber":"+336xxxx","sourceUuid":"1d4xxxx178","sourceName":"moi","sourceDevice":1,"timestamp":1673980491174,"syncMessage":{"sentMessage":{"destination":"+336xxxx","destinationNumber":"+33xxxx","destinationUuid":"1d4xxxx8","timestamp":1673980491174,"message":"Tu vois qu'on peut éviter les pics... 😉","expiresInSeconds":0,"viewOnce":false,"attachments":[{"contentType":"image/jpeg","filename":null,"id":"RTJxxxxQ0","size":74900}]}}},"account":"+336xxxx","subscription":0}
[2023-01-17 18:34:51]DEBUG : Send data to jeedom : {"received":{"envelope":{"source":"+336xxxx","sourceNumber":"+336xxxx","sourceUuid":"1dxxxx8","sourceName":"moi","sourceDevice":1,"timestamp":1673980491174,"syncMessage":{"sentMessage":{"destination":"+336xxxx","destinationNumber":"+3366xxxx","destinationUuid":"1xxxx8","timestamp":1673980491174,"message":"Tu vois qu'on peut éviter les pics... 😉","expiresInSeconds":0,"viewOnce":false,"attachments":[{"contentType":"image/jpeg","filename":null,"id":"RTJm7qxxxxQ0","size":74900}]}}},"account":"+336xxxx","subscription":0}}
[2023-01-17 19:34:51]DEBUG : Message de groupe => NON
[2023-01-17 18:34:51]ERROR : Error on send to jeedom : null

PS : tu vois que j’ai aussi quelques lignes comme ca, je ne sais pas si c’est normal :

[2023-01-17 15:28:07]ERROR : Error on send to jeedom : null

Bon, j’ai mis a jour le plugin avec ta correction, et ca ne passe toujours pas.
J’ai essayé en enlevant l’image, et ca plante toujours.
Et quand j’enlève l’accent (é), ca ne plante plus :slight_smile:
La phrase en entier (au cas ou ca ne serait pas ca) :

Tu vois qu’on peut éviter les pics

je fouille un peu avant de m’en aller, sinon je verrais demain

pourrais tu me préciser:

C’est depuis ton téléphone (android? apple?)
depuis un scénario ?

car j’ai essayé de reproduire dans tous les sens mais ton erreur SQL n’est jamais reproduite.
J’en ai trouvé une autre quand on envoi une image depuis le smartphone, mais pas de rapport avec ton soucis je corrigerais l’erreur par la même occasion

Envoi depuis scénario ou envoi depuis smartphone, avec accents smileys caractères spéciaux, c’est ok chez moi

ça doit être lié du coup :wink:

EDIT: Incorrect string value: ‹ \xF0\x9F\x98\x89 › => ça correspond au smiley « wink »

J’envoi (a n’importe qui) depuis mon téléphone Android
Tu n’as rien le log http.error?
Étrange.

Je viens de mettre une nouvelle béta à dispo.
J’ai refait tout le cheminement sur la gestion des guillemets et caractères spéciaux.

je n’ai réussi à avoir une erreur ERROR : Error on send to jeedom : null que dans un cas, c’était un copier coller sur smartphone.

j’ai refait des dizaines de tests, je n’ai plus jamais vu d’erreurs apparaître, l’affichage et le stockage est correct.

Pourrais-tu me dire si de ton côté c’est résolu? (je te conseille d’envoyer un message « tampon » genre 123 juste pour que le dernier message historisé dans jeedom soit propre, puis faire des essais)

merci bien en tout cas, j’ai mis la main sur un cas spécifique, mais yen a tellement à gérer que parfois 1 modif et ça peut tout chambouler :speak_no_evil:

Hello,
Je viens de mettre à jour et testé, et ca n’est effectivement pas simple.
Les mêmes copier-coller de texte avec les accents ne plantent plus.
Celui avec le smyley oui par contre.
Si tu veux, donnes-moi ton numéro de tel en MP, et je te l’envois
Le message avec juste le smyley qui fait planter :

:wink:

Le log :

0054|thrown in /var/www/html/core/class/DB.class.php on line 102
0055|[Wed Jan 18 17:32:55.145166 2023] [php7:error] [pid 1603] [client 127.0.0.1:52186] PHP Fatal error:  Uncaught Exception: [MySQL] Error code : 22007 (1366). Incorrect string value: '\xF0\x9F\x98\x89' for column `jeedom`.`history`.`value` at row 1  : REPLACE INTO history
0056|SET cmd_id=:cmd_id,
0057|`datetime`=:datetime,
0058|value=:value in /var/www/html/core/class/DB.class.php:102
0059|Stack trace:
0060|#0 /var/www/html/core/class/history.class.php(988): DB::Prepare('REPLACE INTO hi...', Array, 0)
0061|#1 /var/www/html/core/class/cmd.class.php(2296): history->save(Object(signalCmd))
0062|#2 /var/www/html/core/class/cmd.class.php(1782): cmd->addHistoryValue('\xF0\x9F\x98\x89', '2023-01-18 17:3...')
0063|#3 /var/www/html/plugins/signal/core/php/jeeSignal.php(54): cmd->event('\xF0\x9F\x98\x89', NULL)
0064|#4 {main}
0065|thrown in /var/www/html/core/class/DB.class.php on line 102

En lisant ceci je suis allé vérifier dans la bdd, et la table history est encodée en utf8_unicode_ci. Devrait-elle être en utf8mb4_unicode_ci ? Je ne sais pas…

image

Et en modifiant le type du champ « value » en utf8mb4_unicode_ci , ca passe. Mais j’imagine qu’il risque d’y avoir des effets de bords ailleurs dans l’appli (deja il faudrait passer la colonne Value de la table historyArch dans le meme type j’imagine?
Vous avez quoi vous, comme type de table/champs? (mon install jeedom date un peu (bcp)). Ca a peu etre été modifié

Bien vu! mon cas:
value varchar(127) utf8mb4_general_ci

Ah, j’ai vu des cas similaires sur le forum avec les smiley pour d’autres plugins mais c’était résolu depuis 2020 ! donc je pensais que jeedom était en mb4 depuis longtemps.
Tout est en mb4 chez moi, mon install a plusieurs années pourtant.

bon par contre 127 chars pour l’history, vraiment pas ouf de stocker du texte, vais tronquer les messages trop longs obligé

Hum… mon installation de jeedom date de 2014 je crois.
Ca expliquerait les differences.
Je crois que seul @Loic doit pouvoir nous aider sur ce coup.
Loic : y’a-t-il une raison pour que la structure des tables et champs n’aient pas été mise à jour dans une des mises a jour du core depuis 2014? Serait-ce envisageable dans une future release?

Et sinon, y’a-t-il un moyen facile pour que je puisse mettre a jour la structure de ma base ?

Et pour la taille de 127, j’imagine que c’est pour des histoires de performances.

actuellement il s’agirait de l’ utf8mb4_unicode_ci.

je n’ai même pas tout à fait le même encodage des tables et colonnes ^^

effectivement, y’a bien des tutos sur internet. pas trouvé de migration automatique dans le code du core.

De ce que je crois comprendre, ca ca semble être pour la connection. Toi et moi, on parle du type des colonnes et des tables en base.

Bonjour,
Je ne sais pas trop la, que dit l’outils de verification de la base de données ?

Il dit que tout est bon.
Je suis entrain de chercher sur github le fichier de création de la BDD pour comparer. Mais un simple update sql permettrait de corriger le problème je pense. Reste a savoir sur quelles tables et quelles colonnes :slight_smile:
Mais ca expliquerait peut-etre aussi mes problèmes d’envois via télégram de certaines alertes jeedom contenant des caractères spéciaux…

En faite ce script existe et a été passé en 2020 lors d’un update jeedom mais il y a du avoir un raté chez toi et vu que c’est des cas rare les mauvaise encodage de base (moins de 1% des utilisateurs) on ne prendra pas le risque de passer une nouvelle update pour corriger ca chez tout le monde c’est trop risqué.

Ok, pas de soucis.
Peux-tu juste m’indiquer ou trouver ce fichier?
S’agit-il d’un de ceux-la? core/install/update at V4-stable · jeedom/core · GitHub
(En mp si tu ne veux pas prendre le risque que qqun ne le lance sans savoir)

J’ai cherché mais j’arrive pas a le retrouver malheureusement. Après c’est juste un change collation depuis adminer ca doit etre possible simplement.

1 « J'aime »

Oui, je veux bien, mais encore faut-il savoir sur quelles tables et quelles colonnes :slight_smile:
PS : je ne trouve aucun script SQL datant de 2020 non plus… :frowning:
Bon, si vraiment il faut, je vais comparer les structures de ma base et d’une base vide de jeedom…
Les zip d’install se trouvent apparemment ici, mais je ne connait pas leur nom…
https://codeload.github.com/jeedom/core/zip/

Mais ya pas a tout comparer je comprends pas. Tu as pas la bonne collation tu mets a jour la collation pour toute la base et toute les tables si ca se fait pas tout seul et c’est bon, il faut avoir utf8mb4_general_ci partout rien de plus a faire.