En realidad, MySQL trunca las cadenas al ancho de la columna de forma predeterminada. Genera una advertencia, pero permite la inserción.
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 configura el modo SQL estricto, convierte la advertencia en un error y rechaza la inserción.
Re su comentario:el modo SQL es una configuración de servidor MySQL. Probablemente no sea PDO lo que lo esté causando, pero por otro lado es posible, porque cualquier cliente puede configurar el modo SQL para su sesión.
Puede recuperar el valor sql_mode global o de sesión actual con las siguientes declaraciones:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
El valor predeterminado debe ser una cadena vacía (sin modos establecidos). Puede configurar el modo SQL en su my.cnf
archivo, con el --sql-mode
opción para mysqld, o usando un SET
declaración.
Actualización:MySQL 5.7 y versiones posteriores establecen el modo estricto de forma predeterminada. Ver https://dev.mysql.com/doc/ refman/5.7/en/sql-mode.html