En fait, MySQL tronque les chaînes à la largeur de la colonne par défaut. Il génère un avertissement, mais autorise l'insertion.
mysql> create table foo (str varchar(10));
mysql> insert into foo values ('abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'str' at row 1 |
+---------+------+------------------------------------------+
mysql> select * from foo;
+------------+
| str |
+------------+
| abcdefghij |
+------------+
Si vous définissez le mode SQL strict, il transforme l'avertissement en erreur et rejette l'insertion.
Re votre commentaire :le mode SQL est une configuration de serveur MySQL. Ce n'est probablement pas PDO qui en est la cause, mais d'un autre côté c'est possible, car n'importe quel client peut définir le mode SQL pour sa session.
Vous pouvez récupérer la valeur sql_mode globale ou de session actuelle avec les instructions suivantes :
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
La valeur par défaut doit être une chaîne vide (aucun mode défini). Vous pouvez définir le mode SQL dans votre my.cnf
fichier, avec le --sql-mode
option pour mysqld, ou en utilisant un SET
déclaration.
Mise à jour :MySQL 5.7 et versions ultérieures définissent le mode strict par défaut. Voir https://dev.mysql.com/doc/ refman/5.7/en/sql-mode.html