In realtà, MySQL tronca le stringhe alla larghezza della colonna per impostazione predefinita. Genera un avviso, ma consente l'inserimento.
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 imposti la modalità SQL rigorosa, trasforma l'avviso in un errore e rifiuta l'inserimento.
In merito al tuo commento:la modalità SQL è una configurazione di MySQL Server. Probabilmente non è PDO a causarlo, ma d'altra parte è possibile, perché qualsiasi client può impostare la modalità SQL per la sua sessione.
Puoi recuperare il valore sql_mode globale o di sessione corrente con le seguenti istruzioni:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
Il valore predefinito dovrebbe essere una stringa vuota (nessuna modalità impostata). Puoi impostare la modalità SQL nel tuo my.cnf
file, con il --sql-mode
opzione per mysqld o utilizzando un SET
dichiarazione.
Aggiornamento:MySQL 5.7 e versioni successive impostano la modalità rigorosa per impostazione predefinita. Vedi https://dev.mysql.com/doc/ refman/5.7/en/sql-mode.html