J'ai travaillé sur un site qui avait MySQL Strict Mode activé. Une personne avait une longue chaîne d'agent utilisateur qui a été enregistrée dans notre table de journaux et malheureusement, la chaîne d'agent utilisateur a dépassé la limite de la colonne et a donc provoqué un avertissement. Les données n'ont pas été insérées du tout. P>
Pour éviter de tels problèmes, devrais-je désactiver le mode strict MySQL ou devrais-je venir avec quelque chose par moi-même (j'utilise PHP)? P>
4 Réponses :
Validez les données avant de l'insérer dans votre base de données. Si une chaîne est trop grosse pour s'adapter à votre table, votre colonne est trop étroite ou que les données sont invalides. Vous devez décider si vous le tronquez avant de le stocker, faites quelques déclarations d'erreur, ou les deux. P>
faire
Je souhaite que vous puissiez mettre plus audacieux sur ce "non". Et ce serait bien si vous pouviez transformer la striction de MySQL jusqu'à 11 heures.
Je n'ai pas eu l'impression que le mode serveur est une fonctionnalité de sécurité. Bien que je suppose que cela dépend de votre définition de la fonctionnalité de sécurité
@Chriswue: J'appellerais "Pas de mangler silencieusement vos données" une fonctionnalité de sécurité.
De mon point de vue, le SGBD devrait rejeter des données non valides. Toujours. Pas parfois Insertion des valeurs ajustées pour des valeurs non valides ou manquantes . Je n'aime pas la magie se produire. Mais vous êtes également correct, l'application peut être codée pour prendre en compte ce fait.
Eh bien, c'est à vous de décider avec un mode strict désactivé et voyez comment les choses fonctionnent, je n'ai jamais eu de problème avec elle handicapée, mais faites attention. P>
Toutefois, si les agents d'utilisateur longue sont le seul problème avec le mode strict et que vous ne les lisez pas visuellement que je recommande de bloquer votre UA ou d'augmenter la longueur de champ. P>
Préférez-vous que vos données soient tronquées silencieusement (éventuellement conduisant à des données brisées) ou souhaitez-vous au moins savoir que vous avez un problème? P>
Je recommanderais de laisser un mode strict activé et des limites vérifiant vos données dans votre PHP. Votre application PHP sait, ou du moins devrait savoir, que faire avec une chaîne trop longue. Si vous désactivez le mode strict et laissez la décision à MySQL, MySQL tronquera silencieusement vos chaînes et vous vous retrouverez avec une base de données remplie de poubelles. P>
Le changement de code et de correction est facile, la fixation des données cassées est souvent impossible. P>
Si vous désactivez le mode strict, vous vous retrouverez avec des problèmes étranges comme celui-ci: P>
Varchar (4) stocker plus de caractères que quatre P> blockQuote>
Si vous avez besoin de le faire, des requêtes défaillantes et que vous n'avez pas de connaissances ni de budget pour le réparer - alors oui.
Si quelqu'un demande à cela, c'est comment désactiver le mode strict correctement, juste en ajoutant cela dans mysql config: p>
Vous pouvez vérifier la longueur de la chaîne sur le niveau d'application avant de l'insérer.
@Pekka: Comment le feriez-vous raisonnablement? Je ne veux pas appeler des méthodes partout sur le logiciel.
Eh bien, vous devez probablement échapper aux données entrantes de toute façon quelque part. Un
substr () code> il y aurait fonctionner et ne pas ajouter trop de fouillis. Si votre application fonctionne avec un mode strict sinon (ce qui est génial), j'irais cette route et laissez le mode tel qu'il est