3

当枚举字段设置为无效值时,有没有办法让 MySQL 默认为 NULL?

另外,有没有一种方法可以在 HTML 表单中指定一个值,以便在保存到数据库时将其存储为 NULL。我不想做任何检查,比如“如果为空字符串,则保存 NULL”。如果可能的话,这是个好主意吗?有什么安全问题吗?

我的场景:我有一个 HTML 下拉菜单,其中有一个“null”选项,后跟一个与数据库枚举对应的项目列表。选择并保存 null 选项后,我希望它在数据库中反映为 NULL。现在,它被转换为一个空字符串,按照:

如果将无效值插入 ENUM(即,允许值列表中不存在的字符串),则会将空字符串作为特殊错误值插入。这个字符串与“普通”空字符串的区别在于这个字符串的数值为 0。

http://dev.mysql.com/doc/refman/5.5/en/enum.html

4

1 回答 1

7

"如果 ENUM 列被声明为允许 NULL,则 NULL 值是该列的有效值,默认值为 NULL。如果 ENUM 列被声明为 NOT NULL,则其默认值为允许列表的第一个元素价值观。

在此基础上,如果您不使用 INSERT 语句为该字段设置值,并且您已声明 ENUM 字段接受 NULL,则它将默认为 NULL。

[编辑]

为了解决您的评论,如果您有此表定义

CREATE TABLE IF NOT EXISTS `tbl_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` enum('New','Done') DEFAULT NULL,
  PRIMARY KEY (`id`)
)

并且您的 Web 应用程序正在尝试使用类似这样的方式更新和现有记录

UPDATE `test`.`tbl_test` SET `type` = NULL WHERE `tbl_test`.`id` =1

它将值设置为 NULL。

您可以通过在下拉列表中查询表中可能的 ENUM 值来降低无效枚举数据出现在 HMTL 下拉列表中的风险。这是我发现的一个 PHP 示例

SHOW COLUMNS FROM `tbl_test` WHERE Field = 'type'

[编辑]

要回答您的附加评论,如果您希望用户能够选择 NULL 值并允许空字符串作为有效值,您需要像这样指定您的下拉列表

<select>
  <option value="-1">-- not selected ---</option>
  <option value=""></option>
  <option value="Book">Book</option>
  <option value="Music">Music</option>
</select>

通过使用该<option value= ...>属性,您可以控制 POSTed 到您的 WebApp 的值,然后可以进行相应的处理。在此示例中-1,您的 WebApp 会将 的值转换为 NULL

于 2012-05-15T13:10:08.947 回答