当枚举字段设置为无效值时,将MySQL默认为NULL

当枚举字段设置为无效值时,将MySQL默认为NULL,mysql,html,sql,Mysql,Html,Sql,当枚举字段设置为无效值时,有没有办法使MySQL默认为NULL 另外,是否有一种方法可以在HTML表单中指定一个值,这样,当保存到DB时,它将存储为NULL。我不想做任何检查,比如如果字符串为空,然后保存空字符串。如果可能的话,这是个好主意吗?有安全问题吗 我的场景:我有一个HTML下拉菜单,它有一个空选项,后跟一个对应于DB枚举的项目列表。选择并保存null选项后,我希望它在DB中反映为null。现在,它正在转换为空字符串,如下所示: 如果在枚举中插入无效值,即字符串不是 在允许值列表中,插入

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

另外,是否有一种方法可以在HTML表单中指定一个值,这样,当保存到DB时,它将存储为NULL。我不想做任何检查,比如如果字符串为空,然后保存空字符串。如果可能的话,这是个好主意吗?有安全问题吗

我的场景:我有一个HTML下拉菜单,它有一个空选项,后跟一个对应于DB枚举的项目列表。选择并保存null选项后,我希望它在DB中反映为null。现在,它正在转换为空字符串,如下所示:

如果在枚举中插入无效值,即字符串不是 在允许值列表中,插入空字符串 而是作为一个特殊的错误值。这个字符串可以区分 从一个“正常”的空字符串中 数值为0

如果枚举列被声明为允许NULL,则NULL值是该列的有效值,默认值为NULL。如果枚举列声明为NOTNULL,则其默认值是允许值列表的第一个元素

在此基础上,如果不使用INSERT语句为字段设置值,并且已将枚举字段声明为接受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
<select>
  <option value="-1">-- not selected ---</option>
  <option value=""></option>
  <option value="Book">Book</option>
  <option value="Music">Music</option>
</select>
它会将该值设置为NULL

您可以通过在下拉列表中查询可能的枚举值来降低HMTL下拉列表中出现无效枚举数据的风险

[编辑]

要回答您的附加注释,如果您希望用户能够选择一个空值并允许一个空字符串作为有效值,您需要像下面这样分隔下拉列表

UPDATE `test`.`tbl_test` SET `type` = NULL WHERE `tbl_test`.`id` =1
<select>
  <option value="-1">-- not selected ---</option>
  <option value=""></option>
  <option value="Book">Book</option>
  <option value="Music">Music</option>
</select>

通过使用该属性,您可以控制发布到WebApp的值,然后可以相应地进行处理。在本例中,WebApp将-1的值转换为NULL

在枚举中创建一个值,这意味着没有选择。这不是我想要的方式。对于应用程序来说,这将是一件非常痛苦的事情。请添加一个触发器,将无效值的所有0字符串标记替换为NULL。是否可以为所有枚举创建一个触发器,替换所有表中的所有0字符串?我最好先执行if空字符串,然后在进行插入/更新之前保存NULL检查?允许NULL,NULL是默认值。我不认为摘录处理插入无效值时默认值为NULL的问题。我正在为这个字段设置一个值;它来自HTML表单。我不需要针对错误数据进行验证——我实际上希望HTML表单能够将字段设置为NULL。也许我在你的问题中遗漏了什么,但你的问题实际上是你的web应用程序如何处理数据是的,我知道SET type`=NULL`会将字段值设置为NULL。问题是我从一个HTML表单中获取了我的值。有没有一种方法可以从HTML表单发送空值?如果不是,我如何让MySQL接受无效的枚举值并将字段默认为空值?好的,您的WebApp必须处理发布的数据并将您的值转换为空值。你能做这个改变吗?是的,我能。这会有点乏味。希望有一个更简单的解决方案。