Activation de l'historique sur un objet contenant plus de 100 champs - Erreur MySQL "Row size too large"

4.0
Tags: #<Tag:0x00007f7d6fd619a8>
Activation de l'historique sur un objet contenant plus de 100 champs - Erreur MySQL "Row size too large"
0

(Bruno Montagnac) #1

Bonjour,

nous souhaitons activer la fonction d’historique sur un objet de taille significative (>100 objectFields).
Lors de l’activation, aucune erreur n’est notifiée dans l’UI.

Lors des modifications de l’objet métier, aucun enregistrement d’historique n’est créé.
En allant inspecter les logs système, nous retrouvons des erreurs MySQL “MySQLSyntaxErrorException: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs”.

En comparant la structure des tables de l’objet métier et de l’objet “_historic”, nous avons constaté qu’il manquait deux colonnes. Il se trouve que ces deux colonnes sont de type énumération multiples mais ça n’a peut-être pas de lien.

Avez-vous déjà rencontré ce problème?


(David AZOULAY) #2

Quel type de table MySQL utilisez vous (MyISAM ou InnoDB) ?


(Bruno Montagnac) #3

Bonjour David, nous utilisons l’ENGINE ‘InnoDB’ et le ROW_FORMAT ‘Compact’ (infos récupérée par SELECT * FROM information_schema.TABLES WHERE TABLE_NAME like ‘bcsi_%’).


(David AZOULAY) #4

De ce que je vois sur le net cette limite de MySQL de 64Kb par record hors LOBs est valable quel que soit l’engine. cf. https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html (§ “row size limit”)

Visiblement le contournement indiqué (transformer des colonnes varchar en text où LOBs) est la seule approche au niveau de la base. Je ne connaissais pas cette limite de MySQL je vais faire des tests.

Je vais aussi regarder quels seraient les impact socle pour mettre en visibilité cette limite MySQL dès le paramétrage

Mais je suis un.peu étonné car 100 champs texte qui atteignent la limite de 64Kb ça veut dire des champs de 655 caractères en moyenne… Puis-je avoir la définition de votre objet en MP

Au niveau logique il peut y avoir des approches différentes pour éviter d’atteindre cette limite (splitter le gros objet en plusieurs objets en relation 0-1, passer certains champs de type texte en document de type texte, etc)

PS: s’agissant d’une limite technique de MySQL et pas d’une anomalie du socle Simplicité, je requalifie le post en support


(David AZOULAY) #5

J’ai vérifiéé dans le code , dans le moteur Simplicité les champs de type texte long, bloc note et contenu HTML sont créés en colonne de type longtext dans le cas de MySQL. Ce type est un des type text (cf. https://dev.mysql.com/doc/refman/5.7/en/string-type-overview.html).

Donc tous les champs de ces types ne comptent donc que pour une dizaine d’octets vis à vis de la limite à 64K. Je reste donc dubitatif sur le paramétrage votre objet.J’attends donc sa définition pour comprendre comment avec seulement une centaine de champs vous pouvez atteindre la limite à 64Kb