5

我的 MySQL 服务器(在 Windows 2008 服务器上通过 PDO 使用 PHP 运行)在插入比列中允许的长度更长的字符串时返回错误代码 1406(字段数据太长)。问题是我在某处读到 MySQL 通常会在不处于严格模式时截断数据。我更改了 my.ini 中的 sql_mode,这样即使在启动时它也不会进入严格模式(当前是“”),但它仍然给我错误并回滚,所以数据丢失了(截断是所需的网站行为)。

我进入命令行并在较短的 varchar 字段中插入了一个长字符串,它确实截断了数据并保存了,但站点却没有。当我将模式改回严格时,它没有在命令行中截断(只有错误)。

此外,我让站点输出当前的 sql 模式,包括全局和会话(@@GLOBAL.sql_mode 和 @@SESSION.sql_mode),它们都输出“”,但不能按预期工作。

有谁知道是什么原因造成的和/或如何改变它?

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

非常感谢你

4

2 回答 2

4

你真的不应该那样做——请不要让坏数据进入你的数据库,并在你插入之前在你的脚本中清理它。

如果您不知道 VARCHAR 列的实际宽度或不想在脚本中对其进行硬编码,则可以通过使用如下查询查询INFORMATION_SCHEMA 表COLUMNS从数据库中读取它:

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

(您可能希望将其限制为 only data_type = 'varchar')。有了这些信息,特别是character_maximum_length,您可以使用 PHP substr将输入字符串修剪为所需的长度。

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

但是如果你坚持不安全的方式,你可以尝试通过执行以下命令暂时禁用严格模式:

SET sql_mode = '';

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

于 2012-12-28T22:00:42.737 回答
0

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

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

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

有了这些中的任何一个,您的问题都应该消失。

PS:我已经阅读了您遇到的错误,但我仍然认为服务器在传统模式下运行(所以我建议将 sql_mode 设置为空是正确的)。

PS2:修改了my.cnf后,有没有重启mysql服务器?

于 2012-12-28T23:11:09.093 回答