精华内容
下载资源
问答
  • 数据库NULL

    2016-07-04 11:15:30
    NULL是什么意思NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值...

    NULL是什么意思

    NULL这个值表示UNKNOWN(未知):它不表示“”(空字符串)。假设您的SQL Server数据库里有ANSI_NULLS,当然在默认情况下会有,对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个 UNKNOWN值进行比较,并在逻辑上希望获得一个答案。您必须使用IS NULL操作符

    使用ISNULL(var,value)来进行NULL判断:当var为NULL的时候,var = value,并且返回value

    NULL 值是遗漏的未知数据。
    默认地,表的列可以存放 NULL 值。

    SELECT LastName,FirstName,Address FROM Persons
    WHERE Address IS NULL

    SELECT LastName,FirstName,Address FROM Persons
    WHERE Address IS NOT NULL

    展开全文
  • 数据库查询错误null Java中NULL用法的简单示例: public Employee getByName(String name) { int id = database.find(name); if (id == 0) { return null; } return new Employee(id); } 这种方法有什么问题?...
    数据库查询错误null

    数据库查询错误null

    Java中NULL用法的简单示例:

    public Employee getByName(String name) {
      int id = database.find(name);
      if (id == 0) {
        return null;
      }
      return new Employee(id);
    }

    这种方法有什么问题?

    它可能返回NULL而不是对象-这是错误的。 在面向对象的范例中, NULL是一种可怕的做法,应不惜一切代价避免使用NULL 关于此出版物已经有很多意见,包括《 空引用》, Tony Hoare撰写的 《十亿美元的错误》演讲和David West撰写的整本《 Object Thinking 》。

    在这里,我将尝试总结所有的参数,并举例说明如何避免使用NULL并使用适当的面向对象的构造代替它们。

    基本上,可以使用NULL两种替代方法。

    第一个是Null Object设计模式(最好的方法是使其成为常数):

    public Employee getByName(String name) {
      int id = database.find(name);
      if (id == 0) {
        return Employee.NOBODY;
      }
      return Employee(id);
    }

    第二种可能的替代方法是在无法返回对象时抛出异常,从而快速失败

    public Employee getByName(String name) {
      int id = database.find(name);
      if (id == 0) {
        throw new EmployeeNotFoundException(name);
      }
      return Employee(id);
    }

    现在,让我们看看反对NULL的参数。

    除了上面提到的Tony Hoare的演示文稿和David West的书以外,我在写这篇文章之前还阅读了这些出版物:Robert Martin的Clean Code ,Steve McConnell的Code Complete ,John Sonmez的“ No”到“ Null”是否返回无效的不良设计? StackOverflow上的讨论。

    临时错误处理

    每次获取对象作为输入时,都必须检查它是否为NULL或有效的对象引用。 如果忘记检查,则NullPointerException (NPE)可能会在运行时中断执行。 因此,您的逻辑将受到多次检查以及if / then / else分支的污染:

    // this is a terrible design, don't reuse
    Employee employee = dept.getByName("Jeffrey");
    if (employee == null) {
      System.out.println("can't find an employee");
      System.exit(-1);
    } else {
      employee.transferTo(dept2);
    }

    这就是应该用C和其他命令式程序语言处理异常情况的方式。 OOP引入了异常处理,主要是为了摆脱这些临时的错误处理块。 在OOP中,我们让异常冒泡直到它们到达应用程序范围的错误处理程序,并且我们的代码变得更加简洁明了:

    dept.getByName("Jeffrey").transferTo(dept2);

    考虑NULL引用是过程编程的继承,请改用1)Null对象或2)异常。

    歧义语义

    为了明确传达其含义,必须将函数getByName()命名为getByNameOrNullIfNotFound() 每个返回对象或NULL函数都应该发生相同的情况。 否则,代码阅读器不可避免地会产生歧义。 因此,为了保持语义的明确性,应为函数指定更长的名称。

    要摆脱这种歧义,请始终返回真实对象,空对象或引发异常。

    有人可能会争辩说,为了性能起见,我们有时必须返回NULL 例如,当地图中没有这样的项目时,Java中接口Map get()方法将返回NULL

    Employee employee = employees.get("Jeffrey");
    if (employee == null) {
      throw new EmployeeNotFoundException();
    }
    return employee;

    由于Map使用NULL ,因此此代码仅搜索一次Map 如果我们将Map重构,以便其方法get()在未找到任何内容的情况下将引发异常,则我们的代码将如下所示:

    if (!employees.containsKey("Jeffrey")) { // first search
      throw new EmployeeNotFoundException();
    }
    return employees.get("Jeffrey"); // second search

    显然,此方法的速度是第一种方法的两倍。 该怎么办?

    Map界面(对其作者没有冒犯)具有设计缺陷。 它的方法get()应该一直返回一个Iterator以便我们的代码如下所示:

    Iterator found = Map.search("Jeffrey");
    if (!found.hasNext()) {
      throw new EmployeeNotFoundException();
    }
    return found.next();

    顺便说一句,这正是C ++ STL map :: find()方法的设计方式。

    计算机思维与对象思维

    有人知道Java中的对象是指向数据结构的指针,而NULL是指向0x00000000的指针(在Intel x86处理器中为0x00000000 if (employee == null)就会理解if (employee == null)语句。

    但是,如果您开始以对象为对象进行思考,那么这种说法就没有意义了。 这是我们的代码从对象角度看的样子:

    - Hello, is it a software department?
    - Yes.
    - Let me talk to your employee "Jeffrey" please.
    - Hold the line please...
    - Hello.
    - Are you NULL?

    对话中的最后一个问题听起来很奇怪,不是吗?

    相反,如果他们在我们请求与Jeffrey通话后挂断电话,这会给我们造成问题(异常)。 此时,我们尝试再次致电或通知主管,我们无法联系Jeffrey并完成更大的交易。

    或者,他们可以让我们与不是Jeffrey的其他人交谈,但是可以帮助我们解决大多数问题,或者在我们需要“特定于Jeffrey”的东西时拒绝帮助(空对象)。

    缓慢失败

    上面的代码没有快速失败,而是尝试缓慢消失,从而杀死了其他人。 它没有让所有人知道出了什么问题并且应该立即开始异常处理,而是向客户端隐藏了此故障。

    该参数与上面讨论的“临时错误处理”非常接近。

    最好使代码尽可能脆弱,让它在必要时中断。

    使您的方法对它们操作的数据极为苛刻。 如果提供的数据不足或根本不适合该方法的主要使用场景,请让他们通过引发异常来抱怨。

    否则,返回一个Null对象,该对象暴露一些常见行为,并在所有其他调用上引发异常:

    public Employee getByName(String name) {
      int id = database.find(name);
      Employee employee;
      if (id == 0) {
        employee = new Employee() {
          @Override
          public String name() {
            return "anonymous";
          }
          @Override
          public void transferTo(Department dept) {
            throw new AnonymousEmployeeException(
              "I can't be transferred, I'm anonymous"
            );
          }
        };
      } else {
        employee = Employee(id);
      }
      return employee;
    }

    可变和不完整的对象

    通常,强烈建议设计时牢记不变性的对象。 这意味着对象在实例化过程中会获得所有必需的知识,并且在整个生命周期中都不会改变其状态。

    通常,在延迟加载中使用NULL值,以使对象不完整且可变。 例如:

    public class Department {
      private Employee found = null;
      public synchronized Employee manager() {
        if (this.found == null) {
          this.found = new Employee("Jeffrey");
        }
        return this.found;
      }
    }

    该技术尽管被广泛使用,但在OOP中却是一种反模式。 主要是因为它使一个对象负责计算平台的性能问题,而这是Employee对象不应该意识到的。

    对象不必管理状态并公开其与业务相关的行为,而必须处理其自身结果的缓存-这就是延迟加载的意义所在。

    缓存不是员工在办公室里做的事情,对吗?

    解决方案? 请勿以上述原始方式使用延迟加载。 相反,请将此缓存问题移至应用程序的另一层。

    例如,在Java中,您可以使用面向方面的编程方面。 例如, jcabi-aspects具有@Cacheable批注,用于缓存方法返回的值:

    import com.jcabi.aspects.Cacheable;
    public class Department {
      @Cacheable(forever = true)
      public Employee manager() {
        return new Employee("Jacky Brown");
      }
    }

    我希望这种分析令人信服,您将停止NULL您的代码!

    相关文章

    您可能还会发现以下有趣的帖子:

    翻译自: https://www.javacodegeeks.com/2014/09/why-null-is-bad.html

    数据库查询错误null

    展开全文
  • 可以看到Time字段的一列值是NULL 将这个字段值转string后,可以发现它空字符串

    可以看到Time字段的一列值是NULL

    将这个字段值转string后,可以发现它是空字符串

    展开全文
  • 一、普通的 null 查询 ----数据表---- mysql> select * from person; +------+--------+-------+ | id | name | phone | +------+--------+-------+ | 1 | 李白 | 10086 | | 2 | 杜甫 | NULL | | 3 | 陶渊明 ....

    一、普通的 null 查询

    ----数据表----
    
    mysql> select * from person;
    +------+--------+-------+
    | id   | name   | phone |
    +------+--------+-------+
    |    1 | 李白   | 10086 |
    |    2 | 杜甫   | NULL  |
    |    3 | 陶渊明 | NULL  |
    +------+--------+-------+
    3 rows in set (0.00 sec)
    
    ----查询其中 phone 不为空的 name ----
    
    mysql> select name,phone from person where phone is not null;
    +------+-------+
    | name | phone |
    +------+-------+
    | 李白 | 10086 |
    +------+-------+
    1 row in set (0.00 sec)

    二、null = null 

    mysql> select null = null,null = 1,null = 2;
    +-------------+----------+----------+
    | null = null | null = 1 | null = 2 |
    +-------------+----------+----------+
    |        NULL |     NULL |     NULL |
    +-------------+----------+----------+
    1 row in set (0.00 sec)

    三、  null <=> null

    mysql> select null <=> null,null <=> 1,null <=> 2;
    +---------------+------------+------------+
    | null <=> null | null <=> 1 | null <=> 2 |
    +---------------+------------+------------+
    |             1 |          0 |          0 |
    +---------------+------------+------------+
    1 row in set (0.00 sec)

    那么 = 与 <=> 有什么区别呢?

    MySQL中的比较运算符:

    展开全文
  • 数据库NULL

    千次阅读 2005-01-10 13:52:00
    NULL 使用详解软件环境: 1、Windows NT4.0+ORACLE 8.0.42、ORACLE安装路径为:C:/ORANT含义解释: 问:什么是NULL?答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有...
  • 什么Mysql 数据库尽量避免NULL

    千次阅读 2020-07-13 16:55:09
    在Mysql中很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。但我们常在一些Mysql性能优化的书或者一些博客中看到观点:在数据列中,尽量不要用NULL 值,...
  • [数据库可以取到数据,为什么取出全是null图片说明](https://img-ask.csdn.net/upload/201811/11/1541944731_42004.png)图片说明](https://img-ask.csdn.net/upload/201811/11/1541944723_489031.png)图片说明]...
  • 数据库使用NULL对于效率有什么影响

    千次阅读 2016-05-23 16:52:39
    MYSQL难以优化可空列的查询,它会使索引,索引统计和值更加复杂.可空列需要更多的存储空间,还...但把NULL列改为NOT NULL带来的性能提示很小,除非确定它带来了问题,否则不要把它当成优先的优化措施,最重要的使用的列的
  • Null貌似在哪里都个头疼的问题,例如Java里有人头疼的NullPointerException,为了避免猝死及防空指针异常,千百年来程序猿们不得不在代码里小心翼翼的各种如果判断,麻烦而又臃肿,估计java8发出了可选来避免这一...
  • 目录 null有哪些缺点? 1. 空间相关 可能有些晦涩难懂,举个栗子: ...再说下为什么Not Null更优化 小结 null有哪些缺点? 1. 空间相关 NULL占空间 下面来自Mysql官网的解释: “NULL...
  • NULL是一种比较特殊的数据类型,这也可以解释为什么字段设置为NOT NULL,却仍然可以插入空值。设置了NOT NULL之后便不能插入NULL值了,但仍然可以插入像 ' ' 这样的空值。另外空值是不占用空间的,而NULL需要占用...
  • 利用DBUtils进行数据库查询的时候 如果查询的一个对象,没有查询到返回null 如果查询的一个集合,没有查询到返回的一个空集合
  • 记录一下笔记: ...这种过滤不会过滤空值,比如上图中id=4中的数据,此时name的看起来什么都没有,也不是带底纹的null,他的值空字符串'',也就是说,用is not null过滤不了这种数据 可以在数据中查询一下.
  • 港真,Null 貌似在哪里都个头疼的问题,比如 Java 里让人头疼的 NullPointerException,为了避免猝不及防的空指针异常,千百年来程序猿们不得不在代码里小心翼翼的各种 if 判断,麻烦而又臃肿,为此 java8 引入了 ...
  • 因为数据库中对应的字段使用了下划线 如 spec_name 在entity 中使用的specName , 将entity中改为 spec_name 后就能取出数据。数据库中的Upper 字段对应entity 中的 upper,也 能取出数据的。  总结: mybatis...
  • 提交后 数据库多了一条 但是显示是null 是不是我ajax用的不对啊 tt.php <!DOCTYPE html> <html> <head> <title></title> <script type="text/javascript"> ...
  • 1.null是系统默认的!不消耗数据库空间! 2.而空,有可能是插入了数据,然后又删除了数据!虽然看上去跟null是一样的,都没有数据,但是数据库系统还是要处理它的!只不过你没有感觉到!...
  • public void save(Emp emp) throws... 这段代码就是往数据库里面插入的代码,可是当我查数据的时候,显示的sname字段都是NULL,这什么啊。以前也用过这段代码,没问题啊,今天不知道为什么,插入不进去啊,郁闷 啊
  • !... ``` switch ($getType) { case "1": ... $data = array();... $sql = "SELECT songId, songName, singerName, songAlbum, albumName FROM web_songsinfo, web_singersinfo, web_albumsinfo WHERE songName ...
  • 数据库空值和null的区别

    万次阅读 2015-09-01 10:38:55
    所谓的NULL就是什么都没有,连\0都没有,\0在字符串中结束符,但是在物理内存占空间的,等于一个字节,而NULL就是连这一个字节都没有。在数据库严格区分的,任何数跟NULL进行运算都是NULL, 判断值是否等于...
  • 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错。 Tony Hoare 在1965年发明了 null 引用, 并认为这他犯下的“几十亿美元的错误”. 即便50年后的今天,...
  • mysql中的NUll是什么 ? 维基百科是这样说的:空值(Null或NULL)是结构化查询语言中使用的特殊标记,是中对数属性未知或缺失的一种标识,用于指示数据库中不具值。由关系数据库模型的创作者 E.F.科德所引入。SQL...
  • java 获取数据库表中的信息,为什么中文字段读出为null,其他字段为数字都读出来了 ``` JdbcUtil jdbcUtil = null; try{ jdbcUtil = new JdbcUtil(); //获取数据库连接 jdbcUtil.getConnection...
  • 数据库惊现"NULL

    2007-06-22 18:36:00
    折腾了一阵,我十分惊讶的发现数据库中此字段竟然字符串形式的“NULL”! 对于新手而言,将SET something=NULL 写成SET something='NULL' 倒也不是什么稀奇事儿,甚至他们本来就不清楚NULL到底为何物...
  • 问:什么是NULL?  答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零。ORACLE允许任何一种数据类型的字段为空,除了以下两种情况:  1、主键字段...
  • 数据库字段的值为NULL时,我们使用jdbc获取到的值为什么呢?对于varchar、char等类型当使用getString时,根据常识轻松地知道值应该是NULL。但是,对于int、float等类型,当我们使用getInt、getFloat方法时应该返回...
  • ps.setFloat(8, device.getLatitude());如果device.getLatitude()返回的是null就报错,也就是说setFloat不能插入空值,而setString()方法就可以,不知道为什么请高手指点,谢谢!!
  • 此文将以三个方案为例来说明数据库中为什么需要外键(本文使用的Navicat Premium可视化数据库管理工具来操作数据库) 方案一: createtable user_info( idchar(36) primarykey, user_name varchar(30) notnull, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,154
精华内容 861
关键字:

数据库null是什么