暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

了解NULL和空字符串:数据库的细微差别

DBA巫师 2024-03-31
317

  

点击上方蓝字关注我们

    在关系型数据库领域中,NULL和空字符串('')是两个在概念上具有根本区别的实体。它们在功能和使用场景上有着显著的差异,因此在使用数据库时需要对它们有正确的理解和应用。我们将在接下来的部分中,对于Oracle, MySQL, PostgreSQL (简称PG), 和SQL Server这四个广泛使用的数据库系统中NULL与空字符串的处理方式进行详细的阐述和讲解。

使用场景

NULL 应该用在字段值确实缺失或未知的情况下。例如,一个用户的中间名可能在系统中并未提供,这个时候使用NULL是恰当的。

空字符串 应该用在你知道字段值应该是字符串,但是它是“无内容”的情况。比如,用户填写了一个表单,但是某个可选的文本字段被留空了。

Oracle


Oracle

在Oracle数据库中,NULL表示一个缺失的值,它是未知的或不适用的。NULL不等同于空字符串或者零;它是数据库中的一个特殊的占位符。Oracle数据库中有个特殊情况,它将空字符串视为NULL。这是基于Oracle的设计原理,认为一个空的字符串实际上也是一个未知的值。因此,在Oracle中,如果你插入一个空字符串到一个字段,这个字段其实会存储一个NULL值。
例如,以下是一个Oracle中的例子:
    INSERT INTO table_name (column_name) VALUES ('');
    在上述例子中,column_name
    将会存储一个NULL值。


    MySQL

    MySQL中,NULL同样表示一个缺失的值。但与Oracle不同的是,MySQL区分空字符串和NULL。空字符串在MySQL中是一个有效的值,表示一个长度为零的字符串。
    例如:
      INSERT INTO table_name (column_name) VALUES (NULL);
      INSERT INTO table_name (column_name) VALUES ('');
      在上面的第一个语句中,column_name
      将存储NULL,而在第二个语句中,
      它将存储一个长度为零的字符串。


      PostgreSQL

      在PostgreSQL中,NULL的概念与MySQL类似,也是代表一个缺失的值。同样,空字符串被视为有效值,它只是一个长度为零的字符串。
      例如:
        INSERT INTO table_name (column_name) VALUES (NULL);
        INSERT INTO table_name (column_name) VALUES ('');
        这里的行为和MySQL一致,column_name
        会分别存储NULL和空字符串。



        SQL Server

        SQL Server中的NULL也是代表未知或缺失的值。和MySQL及PostgreSQL一样,它区分NULL和空字符串。
        例如:
          INSERT INTO table_name (column_name) VALUES (NULL);
          INSERT INTO table_name (column_name) VALUES ('');
          这里,column_name
          同样会分别存储NULL和空字符串。



          NULL的使用


          在所有关系型数据库系统中,NULL都有共同的含义,它代表着一个缺失的或未定义的值。NULL的一些重要特性包括:
          • 比较的特殊性:在SQL中,任何与NULL的直接比较都会返回未知(即不是真也不是假)。这就是为什么检查一个字段是否为NULL时,你需要使用IS NULL
            IS NOT NULL
          • 算术运算:任何包含NULL的算术运算都将返回NULL,例如,NULL + 10
            结果是NULL,因为如果其中一个操作数是未知的,那么结果也是未知的。
          • 聚合函数:大多数聚合函数(如SUM, AVG等)会忽略NULL值。但是,COUNT(*)会包括NULL值,因为它计算的是行数,而不是特定列的值;相对地,COUNT(column_name)不会计算该列的NULL值。



          空字符串使用


          空字符串('')是一个明确的值,它表示一个长度为零的字符串。它在字符串运算中的行为与普通字符串一致:
          • 比较:空字符串可以与其他字符串进行比较,'' = ''
            将返回真。
          • 串联:空字符串可以与其他字符串连接,例如 'hello' || ''
            将简单地返回 'hello'
          • 聚合函数:空字符串将被聚合函数视为有效值。



          数据库设计的影响


          在数据库设计中,NULL的使用是基于三值逻辑(true, false, unknown)的,这允许数据库能够正确处理缺失数据的情况。在关系型数据库的设计中,NULL的使用是为了提供一个明确的方式来表示数据的缺失或适用性。而空字符串的使用则是基于字符串数据类型的定义,空字符串是字符串类型的一个有效实例,只是它不包含任何字符。
          在设计数据库架构时,如何使用NULL和空字符串将对数据的完整性和系统的逻辑有重大影响。
          • 模式设计:你需要决定哪些字段是必须的,哪些是可选的。必须的字段应该定义为NOT NULL,而可选的字段可以接受NULL值。
          • 数据完整性:允许NULL值的字段会影响数据完整性约束,如外键约束。如果一个字段可以是NULL,那么即使它是外键也可以不参考任何实际的外键值。
          • 业务逻辑:应用程序的业务逻辑需要妥善处理NULL和空字符串。例如,在显示数据时,你可能需要决定是否将NULL值显示为“N/A”、“未知”或保留为空白。



          数据库特定考虑


          • Oracle:由于Oracle将空字符串视为NULL,这可能会导致在字符串操作中出现一些非直觉的行为。例如,如果你期望一个空字符串可以用作默认值,那么在Oracle中这会导致NULL值,可能不是所期望的。
          • MySQL、PostgreSQL、SQL Server:这些数据库区分NULL和空字符串,因此在它们中可以更明确地表示没有数据(NULL)和空字符串数据('')。在使用这些数据库时,开发者需要确保他们的应用程序能够正确处理两种情况。

          SQL示例

          考虑到这些差异,下面是一些关于如何在SQL中检查NULL和空字符串的示例:
            -- Checking for NULL
            SELECT * FROM table_name WHERE column_name IS NULL;


            -- Checking for empty string
            SELECT * FROM table_name WHERE column_name = '';


            -- Checking for both NULL and empty string in MySQL, PostgreSQL, SQL Server
            SELECT * FROM table_name WHERE (column_name IS NULL OR column_name = '');



            在Oracle中,最后一个查询检查空字符串的条件是多余的,因为NULL和空字符串被认为是等价的。但是在其他数据库中,这是必要的,以确保捕捉到所有的“空白”数据。


            结论


            在数据库设计和使用中,NULL和空字符串有明确的区别。NULL适用于数据项没有值、值未知或不适用的情况,而空字符串表示已知的、明确的空值。不同的数据库管理系统对这两者的处理可能有所不同,因此在设计数据库模式、编写SQL语句、开发应用程序逻辑以及数据迁移和集成时,都需要注意处理NULL和空字符串的差异,以确保数据的一致性、完整性和精确性。

            文章转载自DBA巫师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论