"NOT NULL DEFAULT"是什么意思?

GSt*_*Sto 22 mysql

我在一个数据库的很多字段上都看到了这个,我正在研究一个项目,其中一个列将被定义为非null,但是默认情况下会有一个空字符串.这样做有什么意义?如果您允许空字符串,为什么不允许字段为空?

Pis*_*3.0 36

NULL具有特殊行为:将任何值与NULL进行比较会返回a NULL,这是除了false或之外的其他内容0.这意味着"未知".

例如,拿这个表:

 user_id | gender
------------------
 1       | NULL
 2       | 'M'
 3       | 'F'
 4       | 'F'
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM mytable WHERE gender = 'M' 将按预期返回1行

SELECT * FROM mytable WHERE gender != 'M' 将返回2行,而不是3行.

SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL 将返回预期的3行.


编辑:对于某些应用程序,使用0(或者,上帝禁止,另一个"幻数")而NULL不是甚至不可取(单位或精确值在此示例中不相关):

 Date       | Temperature 
--------------------------
 2010-01-01 | 10          
 2010-01-02 | 4
 2010-01-03 | 0
 2010-01-04 | -22
 2010-01-05 | -45
 2010-01-06 | NULL
 2010-01-07 | -34
Run Code Online (Sandbox Code Playgroud)

在这里,NULL1月6日意味着"价值未知" - 也许是因为温度很低,温度计探头停止响应.然而,它与1月3日完全不同,当时温度为00度.

此外,作为@Bill Karwin提到,NULL的表现特别是在聚合函数(COUNT,SUM,AVG等):计算AVG(Temperature)上述数据会给你-14.5,作为空行被忽略.

  • +1还值得一提的是,大多数聚合函数都会跳过NULL.对于`SELECT AVG(Temperature)`,你可能不希望将NULL计为零,因为它会使你的结果产生偏差.所以NULL确实有用. (4认同)

Bri*_*oth 11

null和""不是一回事,所以这里没有矛盾.

null /""的语义含义取决于个体,通常是一个"宗教"问题.对某些模式中的某些人来说,当然,它们可能是相同的,但它们并非必须如此.例如,""可能意味着"我明确要求用户输入,他们选择不输入任何内容",而null可能意味着"我从未要求输入".

  • 关于它的评论可能是一个宗教问题提出了一个观点 - 开发者的背景和经验可能发挥作用.以下示例在不同语言中的行为有所不同:''== null,""== null,0 == null,""=== null.对于一些你有明确的类型检查(如String.Empty或===运算符,或strcmp()),它很容易出错.某些语言中的区别比其他语言更清晰 - 某些脚本语言尤其使得生活比其他语言更难(例如Perl在这方面尤其微妙). (2认同)