MySQL trunkerar faktiskt strängar till kolumnbredden som standard. Den genererar en varning, men tillåter insättningen.
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 |
+------------+
Om du ställer in det strikta SQL-läget förvandlar det varningen till ett fel och avvisar infogningen.
Angående din kommentar:SQL-läge är en MySQL-serverkonfiguration. Det är förmodligen inte PDO som orsakar det, men å andra sidan är det möjligt eftersom vilken klient som helst kan ställa in SQL-läge för sin session.
Du kan hämta det aktuella globala värdet eller session sql_mode med följande satser:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
Standard bör vara en tom sträng (inga lägen inställda). Du kan ställa in SQL-läge i din my.cnf
fil, med --sql-mode
alternativ för mysqld, eller använda en SET
uttalande.
Uppdatering:MySQL 5.7 och senare ställer in strikt läge som standard. Se https://dev.mysql.com/doc/ refman/5.7/en/sql-mode.html