Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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 空字符串还是空字符串更有效/更自然?_Mysql_Sql_Database_Database Design_Database Schema - Fatal编程技术网

Mysql 空字符串还是空字符串更有效/更自然?

Mysql 空字符串还是空字符串更有效/更自然?,mysql,sql,database,database-design,database-schema,Mysql,Sql,Database,Database Design,Database Schema,借口,我熟悉空值和空字符串之间的语义差异 我有一个MySQL表,其中存储了许多主机名及其IP地址(作为字符串),我想知道在主机名无法解析的情况下,什么看起来更自然(或更高效的存储方式) 空值或空字符串(在这种情况下,它可能应该是VARCHAR而不是CHAR) 我倾向于使用空值,但我希望对此进行确认或取消确认。Oracle解决了此问题,并对两者进行了相同的解释 Mysql没有,我不是在评判它,但我个人不喜欢它,因此我尽可能多地使用NULL来“标准化”我的代码 另外,从关键字重要性的角度来看,NUL

借口,我熟悉空值和空字符串之间的语义差异

我有一个MySQL表,其中存储了许多主机名及其IP地址(作为字符串),我想知道在主机名无法解析的情况下,什么看起来更自然(或更高效的存储方式)

空值或空字符串(在这种情况下,它可能应该是VARCHAR而不是CHAR)


我倾向于使用空值,但我希望对此进行确认或取消确认。

Oracle解决了此问题,并对两者进行了相同的解释

Mysql没有,我不是在评判它,但我个人不喜欢它,因此我尽可能多地使用NULL来“标准化”我的代码


另外,从关键字重要性的角度来看,NULL正是您想要的,因为它在db语义中表示“未知”。(如果我错了,请纠正我)

我建议您使用
NULL
,而NULL的类型与string不同。例如,更容易筛选出具有此值的行或检测该字段中的值类型,等等。

MyISAM MYSQL中,不使用NULL,每行节省一位。如前所述:

声明列为NULL可以减少允许的最大列数。对于MyISAM表,空列需要行中额外的空间来记录其值是否为空。每个空列需要额外的一位,四舍五入到最近的字节

再看看:

此外,虽然NULL本身不需要任何存储空间,但如果表定义包含任何定义为NULL的列,则NDBCLUSTER每行保留4个字节,最多32个NULL列。(如果MySQL集群表定义的空列数超过32列,最多64列,则每行保留8字节。)

此外,它还使数据库工作更快(摘自-@DavidWinterbottom链接对我不起作用,我添加了另一个来源)

MySQL更难优化引用可为null的列的查询,因为它们使索引、索引统计和值比较更加复杂。可空列使用更多存储空间,需要在MySQL内部进行特殊处理。对可为空的列进行索引时,每个条目需要额外的字节,甚至可能导致在MyISAM中将固定大小的inded(例如单个整数列上的索引)转换为可变大小的inded

在大多数情况下,当与
COUNT()
和其他聚合函数结合使用时,非空值的行为更容易预测,但您也可以根据需要看到空值的行为

如前所述,并非所有的组(聚合)函数都忽略NULL例如,
COUNT()
将为包含NULL值的列提供与
COUNT(*)
不同的结果


另一方面,正如other所指出的,NULL更好地反映了条目的含义——它是一个未知值,如果您想统计所有主机,您可能会
count() >严格按照原样执行。

<强>第一< /强>:仔细考虑<强> null 和<强>空字符串< /强>的不同语义。

  • 第一个最好解释为:
    此字段有一个有效值,但该值尚未知
  • 第二个始终表示:
    此字段的有效值是已知的,精确地说是“”
Second:认识到对空字符串的索引和筛选比对NULL的索引和筛选效果更好、效率更高,因此在真正指前者时不要使用后者

第三个:认识到所有使用NULL的表达式都容易受到三值逻辑的非直观性的影响,除非NULL首先与空字符串(或其他上下文有效值)结合。特别是,排除中间法则不再适用,因此表达式A或~A不再在重言式上正确,只要对A的求值需要对NULL项求值。忘记这一点可能会导致非常微妙和难以定位的错误

not equals运算符定期公开以下内容:

When A has the value NULL:
   The expression A = 0 returns false; 
   The expression A <> 0 returns false; and
   The expression A OR NOT A returns false!
当A的值为NULL时:
表达式A=0返回false;
表达式a0返回false;和
表达式A或非A返回false!
更新
我想我的观点的实质是,它们不是同一种生物,而是非常不同的动物。各有所长。第二个地址字段应始终为非空(除非您打算允许输入部分或不完整的地址),并且它的默认值应始终为空字符串的有效和已知值。NULL应该被限制在以后将提供有效的已知值的情况下,事实上o表示某种必须解决的验证失败

来自下面的OP:


行将不会被更新。在插入上有一个IP地址 地址或没有地址(因为无法解析)

响应:


然后我建议使用空字符串作为默认值,并将字段设置为非NULL。只有在必要时才使用NULL,因为它有一些微妙的缺点。

但是你也可以很容易地过滤空字符串。这有点主观,但是NULL带有“不适用”的含义,这在这里似乎是最自然的。效率不应该是一个因素。@Jack,效率永远是一个因素;)主机名是否需要唯一?您是否曾期望多个IP地址解析为同一主机名?还有,您的引擎是什么?@user2352129我的意思是效率当然不应该是这个特殊情况的一个因素。空行为对我来说从来都不是问题。你能帮我发一个链接到你尊敬的阿尔古吗