为什么 ENUM(“0”, “1”) 在 Mysql 中保存为空字符串?
我有一个 MYSQL 表,其中有一个名为“offset”的 ENUM 字段和一些其他列。该字段定义为:
ENUM(0,1),可以为NULL,预定义值NULL
现在我有两台服务器。生产服务器和开发服务器以及用于创建和更新数据库的相同 PHP 脚本。
第一步:应用程序创建记录而不在 CREATE 查询中传递“偏移量”。
第二步:应用程序向用户询问一些数据(不是“偏移”值),读取第一步中插入的行并创建一个数组,更新一些字段(不是“偏移”字段) ,以自动方式创建查询并使用更新后的值再次保存该行。
自动查询生成器简单地读取数组中传递的所有字段并创建 UPDATE 字符串。
在这两个系统中,我都获得了这个数组:
$values = array(... 'offset' => null);
并在同一查询中转换它,传递 mysql_real_escape_string 中的值:
UPDATE MyTable SET values..., `offset` = '' WHERE id = '10';
现在出现了问题。当我在生产系统中启动查询时,该行被保存,在开发系统中我收到一个错误,数据库说偏移数据错误而没有保存该行。
从 phpmyadmin 当我用第一步创建行时,它在偏移字段中显示 NULL。在系统中保存该字段后,没有出现任何错误,它显示一个空字符串。
两个系统都使用 MySQL 5,但在 Linux 上生产使用 5.0.51,在 Windows 上开发使用 5.0.37。
问题:
为什么一个系统给我一个错误,而另一个系统保存该字段?是配置上的区别吗?
为什么当我保存枚举“0”或“1”字段时,它保存的是“”而不是 NULL ?
I have a MYSQL table with an ENUM field named "offset" and some other columns. The field is defined as:
ENUM(0,1), can be NULL, predefined value NULL
Now I have two server. A production server and a development server and the same PHP script used to create and to update the database.
First step: the application create the record witout passing the "offset" in the CREATE query.
Second step: the application ask to the user some data (not the "offset" value), read the row inserted in step one and make an array, update some field (not the "offset" field), create a query in an automated fashion and save the row again with the updated values.
The automated query builder simple read all the field passed in an array and create the UPDATE string.
In both systems I obtain this array:
$values = array(... 'offset' => null);
and convert it in this same query passing the values in the mysql_real_escape_string:
UPDATE MyTable SET values..., `offset` = '' WHERE id = '10';
Now there is the problem. When i launch the query in the production system, the row is saved, in the development system I got an error and the db says that the offset data is wrong without saving the row.
From phpmyadmin when I create the row with the first step, it shows NULL in the offset field. After saving the field in the system which give no errors, it show me an empty string.
Both system are using MySQL 5 but the production uses 5.0.51 on Linux and development use 5.0.37 on Windows.
The questions:
Why one system give me an error an the other one save the field ? Is a configuration difference ?
Why when I save the field which is an enum "0" or "1" it saves "" and not NULL ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
大概。见下文。
根据 MySQL ENUM 文档:
(强调。)
Probably. See below.
According to the MySQL ENUM documentation:
(Emphasis added.)
strager的答案似乎很好地解释了为什么您的代码在两种环境下的行为不同。
但问题出在别处。如果您想在查询中将值设置为 NULL,您应该完全使用 NULL,但是您使用的是 mysql_real_escape_string(),其结果始终是一个字符串:
您应该以不同的方式处理这个问题。例如:
某些数据库层(例如 PDO)可以很好地为您处理这个问题。
strager's answer seems like a good explanation on why your code behaves differently on the 2 environments.
The problem lies elsewhere though. If you want to set a value to NULL in the query you shound use exactly NULL, but you are using mysql_real_escape_string() which result is always a string:
You should handle this differently. E.g:
Some DB layers, like PDO, handle this just fine for you.
如果您希望它为 NULL,为什么不首先这样做:
If you want it to be
NULL
, why don't you do this in the first place: