实际上,MySQL 默认将字符串截断为列宽。它会生成警告,但允许插入。
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 |
+------------+
如果您设置严格的 SQL 模式,它会将警告变为错误并拒绝插入。
回复您的评论:SQL 模式是 MySQL 服务器配置。它可能不是导致它的 PDO,但另一方面它是可能的,因为任何客户端都可以为其会话设置 SQL 模式。
您可以使用以下语句检索当前的全局或会话 sql_mode 值:
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
默认值应为空字符串(未设置模式)。您可以使用 mysqld 选项或使用语句在my.cnf
文件中设置 SQL 模式。--sql-mode
SET
更新:MySQL 5.7 及更高版本默认设置严格模式。见https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html