微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐