實際上,默認情況下,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;
默認應該是一個空字符串(無模式設置)。您可以在my.cnf
文件中設置SQL模式,使用mysqld的--sql-mode
選項或使用SET
語句。
有關SQL模式的完整文檔,請參閱http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html。
不該你知道你的字段的長度你插入之前......在你知道你打算將哪些字段成? – 2009-06-19 16:57:16
要保持DRY,您可以讀取數據庫字段的長度,並在PHP中使用它來剪切輸入字符串。但我認爲你的應用程序(PHP代碼)必須知道你想保存的數據類型。這意味着你應該在PHP中配置它。 – powtac 2009-06-19 16:57:17