php – 插入时自动截断数据

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

我进入命令行并在较短的varchar字段中插入一个带有长字符串的插入,它会截断数据并保存,但它不是.当我将模式更改回strict时,它没有在命令行中截断(只有错误).

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

有谁知道造成这种情况的原因和/或如何改变它?

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

非常感谢你

解决方法:

您不应该这样做 – 请不要将错误的数据存入您的数据库,并在插入之前在脚本中对其进行清理.

如果您不知道VARCHAR列的实际宽度或者不想在脚本中对其进行硬编码,则可以通过使用以下查询查询INFORMATION_SCHEMA table 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应该地修剪字符串.阅读更多here.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...