Na verdade, o MySQL trunca strings para a largura da coluna por padrão. Gera um aviso, mas permite a inserção.
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 |
+------------+
Se você definir o modo SQL estrito, ele transformará o aviso em erro e rejeitará a inserção.
Re seu comentário:O modo SQL é uma configuração do MySQL Server. Provavelmente não é o PDO que está causando isso, mas por outro lado é possível, porque qualquer cliente pode definir o modo SQL para sua sessão.
Você pode recuperar o valor sql_mode global ou de sessão atual com as seguintes instruções:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
O padrão deve ser uma string vazia (sem modos definidos). Você pode definir o modo SQL em seu
my.cnf
arquivo, com o --sql-mode
opção para mysqld, ou usando um SET
demonstração. Atualização:MySQL 5.7 e posterior define o modo estrito por padrão. Consulte https://dev.mysql.com/doc/ refman/5.7/en/sql-mode.html