Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:NULL vs"&引用;_Mysql - Fatal编程技术网

MySQL:NULL vs"&引用;

MySQL:NULL vs"&引用;,mysql,Mysql,对于MySQL中的文本字段,最好使用defaultnull或default”“ 为什么? 更新:我知道他们每个人的意思。考虑到磁盘空间和性能,我对使用什么更好感兴趣 更新2:嘿,ppl!问题是“使用什么更好”而不是“每个词的意思”或“如何检查它们”…使用默认值null。在SQL中,null与空字符串(“”)非常不同。空字符串特别表示该值被设置为空null表示该值未设置或设置为null。不同的意思,你看 不同的含义和它们的不同用法是为什么适当地使用它们是重要的;使用default null而不是d

对于MySQL中的文本字段,最好使用
defaultnull
default”“

为什么?

更新:我知道他们每个人的意思。考虑到磁盘空间和性能,我对使用什么更好感兴趣


更新2:嘿,ppl!问题是“使用什么更好”而不是“每个词的意思”或“如何检查它们”…

使用默认值
null
。在SQL中,
null
与空字符串(“”)非常不同。空字符串特别表示该值被设置为空
null
表示该值未设置或设置为null。不同的意思,你看


不同的含义和它们的不同用法是为什么适当地使用它们是重要的;使用
default null
而不是
default”“
可能节省的空间量非常小,几乎可以忽略;然而,按照惯例使用适当的默认值的潜在价值相当高。

使用任何有意义的东西
NULL
表示“没有可用/指定的值,
表示“空字符串”

如果不允许空字符串,但用户不必输入值,则
NULL
有意义。如果您需要一个值,但它可以为空,
非空
的值是有意义的

当然,如果您不需要值,但可以指定空值,那么
NULL
是有意义的

从效率的角度来看,可以使用一个额外的位来确定字段是否为空,但在拥有数百万行之前,不要考虑这样的微观优化。

就像一个空框
null
就像没有盒子一样


这是一个很难理解的概念,但正如这里的答案所明确指出的,这是一个很大的区别。

一般来说,NULL应该表示不存在或未提供的数据,因此是比空字符串更好的默认值


有时,空字符串是您需要的数据值,但它几乎不应该是默认值。

NULL表示“没有值”,RDBMS特别对待where子句和联接

“”表示“空字符串”,不作特别处理

这取决于文本代表什么,以及它在查询中实际如何使用

例如,您可以有一份包含一些必修问题和一些可选问题的调查问卷

  • 被拒绝的可选问题在其相应列中应为空
  • 强制性问题的默认值应为空字符串,因为必须回答这些问题。(当然,在真正的应用程序中,您会告诉用户输入一些内容,但我希望您能理解)
'='
产生满足
WHERE
条件的

NULL=NULL
产生不满足
WHERE
条件的
NULL

使用哪个更好取决于您想要得到什么结果

如果您的值默认为
NULL
,则不会出现如下查询:

SELECT  *
FROM    mytable
WHERE   col1 = ?
将始终返回这些值,即使您传递绑定参数的
NULL
,而此查询:

SELECT  *
FROM    mytable
WHERE   col1 = ''
将返回设置为空字符串的行

这适用于
MySQL
,但不适用于
Oracle
,它不区分空字符串和
NULL


Oracle
中,后一个查询将永远不会返回任何内容。

很多人都在回答
null
'
之间的区别,但OP要求占用更少空间/更快的内容,因此我想尝试一下:

答案是这要看情况而定。如果您的字段是
char(10)
,如果未设置为
null
,它将始终占用10个字节,因此
null
将占用更少的空间。每行每分钟一次,但超过数百万行,这可能会增加。我相信,即使是
varchar(10)
也会将一个字节(
\0
)存储为空字符串,因此这可能会在大型表中累积

就查询性能而言,
null
在理论上更快地进行测试,但我还没有看到在索引良好的表上出现任何明显的差异。但是请记住,如果这是所需的返回,您可能必须在应用程序端将
null
转换为
'
。再一次,一行一行,差别是微小的,但它可能会累积起来


总而言之,这是一个微观优化,所以它归结为偏好。我更喜欢使用
null
,因为我想知道那里没有值,也不想猜测它是一个空白字符串(
'
)还是一堆空格(
'
null
在本质上是明确的<代码>''不是。因此,我选择null,因为我是一个明确的人。

使用“”。如果可以断言列为非null,则需要较少的编程工作。这些表之间的空间差异很小。

对于MyISAM表,NULL为每行的每个可空列(NULL位)创建一个额外的位。如果列不可为null,则不需要额外的信息位。但是,这被填充为8位字节,因此对于可空列的计数,您总是获得1+mod 8字节

文本列与其他数据类型略有不同。首先,对于“”而言,表项保存字符串的两字节长度,后跟字符串的字节,是一种可变长度结构。在NULL的情况下,不需要长度信息,但它作为列结构的一部分被包括在内

在InnoDB中,空值不占用空间:它们根本不存在于数据集中。空字符串也是如此,因为数据偏移量不存在