插入时自动截断数据

我的MySQL服务器(在Windows 2008服务器上使用PDO运行)在插入string长度超过列中允许的string时,返回错误代码1406(数据字段太长)。 事情是我读的地方,MySQL通常截断数据,当它不严格模式。 我改变了my.ini中的sql_mode,这样即使在启动时也不会进入严格模式(目前是“”),但它仍然给我错误和回滚,所以数据丢失(截断是期望的网站行为)。

我进入命令行,并在一个较短的varchar字段中使用一个长string进行插入,它会截断数据并保存,但是它不是。 当我将模式改回严格时,它不会在命令行中截断(只有错误)。

此外,我做了网站输出当前的SQL模式,无论是全球和会议(@@ GLOBAL.sql_mode和@@ SESSION.sql_mode),他们都输出“”,但只是不按需要工作。

有谁知道是什么造成这个和/或如何改变它?

我的怀疑是,它可能与PDO启用PDO :: ATTR_ERRMODE = PDO :: ERRMODE_EXCEPTION,但我已阅读,并找不到有用的东西(我不认为这是绝对的解释,但我只是把它放在那里,以便尽可能多的了解这个问题)。

非常感谢你

你不应该这样做 – 请不要让不良数据进入你的数据库,并在插入之前在你的脚本中进行清理。

如果您不知道VARCHAR列的实际宽度,或者不想在脚本中对其进行硬编码,则可以使用如下所示的查询来查询INFORMATION_SCHEMA表中的COLUMNS

 SELECT column_name, data_type, character_maximum_length, ordinal_position FROM information_schema.columns WHERE table_name = 'mytable' 

(你可能想限制这只有data_type = 'varchar' )。 有了这个信息,特别是character_maximum_length ,你可以使用PHP substr修剪你的输入字符串到所需的长度。

这种方法的好处是它不会改变任何服务器配置,而且应该适用于任何其他数据库,而不仅仅是MySQL。

但是,如果你坚持不安全的做法,你可以尝试通过执行这个临时禁用严格模式:

 SET sql_mode = ''; 

之后,MySQL应该默默修剪字符串。 在这里阅读更多。

可能mysql服务器处于“不宽容”模式,也就是说。 传统(最多次)。 你读的是真的,如果mysql服务器在宽容模式下运行。 如果你试图插入太长的字符串,它可能是非常重要的信息,因此mysql会发出错误。 你有几个选择:

1:使用插入忽略(这会将所有错误转换为警告,并将继续截断数据)

2:对于当前会话,将sql_mode设置为“'

有了这些,你的问题就应该消失了。

PS:我已经读了你正在得到的错误,但我仍然认为服务器在传统模式下运行(所以我推荐sql_mode设置为空是没有错的)。

PS2:更改my.cnf之后,你重新启动了mysql服务器吗?