代码之家  ›  专栏  ›  技术社区  ›  GSto

“非空默认值”有什么意义?

  •  22
  • GSto  · 技术社区  · 15 年前

    我在一个我正在工作的项目中的数据库上的很多字段上都看到了这种情况,在这个项目中,列将被定义为非空,但默认值为空字符串。这样做有什么意义?如果允许空字符串,为什么不允许字段为空?

    7 回复  |  直到 15 年前
        1
  •  36
  •   Piskvor left the building Rohit Kumar    9 年前

    空值具有特殊的行为:将任何内容与空值进行比较都会返回 NULL ,这不是 false 0 . 意思是“未知”。

    例如,以该表为例:

     user_id | gender
    ------------------
     1       | NULL
     2       | 'M'
     3       | 'F'
     4       | 'F'
    

    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行。


    编辑:对于某些应用程序,使用 (或者,上帝禁止,另一个“魔法数字”)而不是 无效的 甚至不可取(本例中的单位或精确值不相关):

     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
    

    这里, 无效的 1月6日意味着“值未知”——可能是因为温度太低,温度计探头停止响应。然而,这与1月3日的气温完全不同。 也就是说,0度。

    此外,正如@bill karwin所提到的,空值在聚合函数中表现得特别好。( COUNT , SUM , AVG 等):计算 AVG(Temperature) 上面的数据会给你 -14.5 ,因为忽略了空行。

        2
  •  11
  •   Brienne Schroth    15 年前

    空和“”不是一回事,所以这里没有矛盾。

    空/“”的语义含义取决于个人,通常是一个“宗教”问题。当然,对于某些模式中的某些人来说,它们可能是相同的,但不一定是相同的。例如,“可能”的意思是“我明确要求用户输入,而他们选择不输入任何内容”,而“空”的意思是“我甚至从未要求输入”。

        3
  •  4
  •   gnud    15 年前

    空值和空字符串之间存在差异-至少在SQL中是这样。

    SELECT LENGTH('tata');
    4
    
    SELECT LENGTH(NULL);
    NULL
    
    SELECT LENGTH('tata')-LENGTH('');
    4
    
    SELECT LENGTH('tata')-LENGTH(NULL);
    NULL
    
        4
  •  1
  •   MatthewMartin muthu    15 年前

    大多数与数据库交互的编程语言本机不支持在数据库中工作的空值。例如,在c_中,空值<gt;dbnull.value。在VB中,大多数数据类型都无法处理空语义,例如,不能在日期或in t中存储空值等。通过减少客户端程序看到的空值的数量,可以减少一些麻烦。在vb的例子中,closes意味着字符串的空值是空的,这是一个接近于未初始化的值,与“未知”的空值含义不完全相同。

        5
  •  0
  •   Xavi Ivars    15 年前

    因为有时,在某些语言中,“select”查询会为您提供 一串 无效的 ,您必须检查它是一个内容为“null”的真正字符串还是一个真正的空字符串。

    使用“”最简单(imho)

        6
  •  0
  •   Kevin    15 年前

    我们不允许空值,因为从具有dbnull值的数据表以编程方式访问字段会导致异常,而空字符串具有值,因此不会出错。

        7
  •  0
  •   Aayush Puri    15 年前

    除了@piskvor提到的之外,这种做法还可以防止在从数据库读取后填充bean/对象等时应用程序逻辑中出现一些可能的nullpointerException。