我正在构建一个PHP / MySQL应用程序,我遇到了创建和更新查询的问题 . 我有5列设置为FLOAT类型,也设置为NULL列 . 我不打算在工作流程的后期填写它们 .
但是,我需要为这个数据库创建新的记录,我需要编辑现有的记录,而不需要触及这5个浮点字段 . 我正在使用OOP PHP,它使用标准的 save()
方法来检查对象中是否存在ID . 如果没有,则调用 create()
,如果是,则调用 update()
. 它通常很有效 .
update()
和 create()
方法旨在从每个类顶部声明的 protected static $db_fields
属性数组中提取,该数组包含该表中使用的所有字段 . update()
和 create()
相应地运行该数组以及SQL中的 INSERT INTO
或 UPDATE
.
我的理解是,如果你使用 ''
(两个单引号,空),SQL将跳过那些 INSERT INTO
或 UPDATE
请求并将它们保留为NULL . 页面上任何位置的5个浮点值都没有表单字段,因此当方法运行时,值将为 ''
.
这就是我收到“数据截断”错误的原因吗?它似乎有所不同 - 我之前没有看到过截断的错误,这就是为什么我要来找天才 . 谢谢 .
3 回答
''
和null
不一样 . 如果您的mysql服务器处于严格模式,那么它将拒绝执行插入,因为您已经为该列传递了无效数据 . 没有严格模式,它会返回一个警告 .插入显式
null
,或者甚至不指定插入中的列 .当你更新时,你可以发送你拥有的所有值,因为mysql会自动忽略未更改的值 .
这不是一个解决方案,而只是为了解决这个问题 .
如果将关键字IGNORE添加到语句中,并尝试将''(或任何不以数字开头的字符串)插入float列,MySQL将插入值0,而不是默认值 .
即使默认值为null,两者都将插入0 . 当然,如果没有IGNORE,这两个语句都会引发您所看到的错误 .
简而言之,您收到消息是因为您提供的数据既不是预期类型也不是默认值 .
如果您不打算INSERT数据,它不应该在SQL语句中 .
例如,假设您有一个表“Data”,其中包含id,float1,float2,float3和float4,Float5,您只需添加ID . INSERT应如下所示:
如果浮动被定义为接受
NULL
,则它们将被默认为NULL
. 对于UPDATE语句也是如此,您应该只列出要更改的字段 .