Mysql的NULL和Empty String

Posted Leohahah

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql的NULL和Empty String相关的知识,希望对你有一定的参考价值。

本文基于mysql5.7版本的参考资料:

https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html

https://dev.mysql.com/doc/search/?d=12&p=1&q=null+empty+string 

https://dev.mysql.com/doc/refman/5.7/en/static-format.html

https://dev.mysql.com/doc/refman/5.7/en/dynamic-format.html

昨天新建一个表用于存储表结构信息:

create table tablist(TABLE_SCHEMA varchar(40),TABLE_NAME varchar(40),COLUMN_NAME varchar(40),COLUMN_TYPE varchar(40),
IS_NULLABLE varchar(10),COLUMN_DEFAULT varchar(40),COLUMN_COMMENT varchar(1000),REMARK varchar(2000));

insert into tablist(TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,COLUMN_COMMENT) 
select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,COLUMN_COMMENT 
from information_schema.`COLUMNS` where TABLE_SCHEMA=\'leo\';

然后查询tablist表:

看看有哪些列没有comment于是:

select * from tablist where COLUMN_COMMENT is null;

查到的结果居然是Empty set。不过从以上查询结果和navicat都能看出:null值在结果集中显示的是\'null\'的单词,而空字符串则显示为空。

使用select * from tablist where COLUMN_COMMENT=\'\';查询正常。

在MySQL中NULL值和空字符\'\'是不一样的,这点可能会引起很多新人的困惑,因此查询官网相关的页面总结如下:

  • 两者的查询方式不一样:NULL值查询使用is null/is not null查询,而empty string可以使用=或者!=、<、>等算术运算符,这点算是最主要的区别了。

以下列出的几点算不上区别,只是一些NULL和空字符的使用总结:

  • 在MySQL当中,0和NULL默认可以作为布尔类型的false,任意其他值可以用于表示True,不过一般用1作为True的默认布尔值。
  • 在MySQL当中,NULL值在group by、order by、distinct语句中被认为是相等的,会被分在同一组。
  • 对于MySQL的unique index来说,null值是可以存在多个的,也就是说unique index不会过滤null值。
  • 在MySQL当中,使用order by对包含NULL值的列排序,NULL值会默认排在前边,order by ... desc时排在最后。
  • 同Oracle、MSSQL一样你可以在包含NULL值的列上创建索引,但仅限于MyISAM, InnoDB和MEMORY存储引擎。
  • 默认情况下LOAD DATA会把空字符或缺失字段全部设置为空字符。如果想要插入NULL值请使用\\N,在某些特殊情况下也可以使用NULL字符,但需要设置正确的LOAD DATA语法项,参考https://dev.mysql.com/doc/refman/5.7/en/load-data.html
  • 在使用COUNT(), MIN(), and SUM()等函数时,NULL值会被忽略,当然count(*)除外。
  • 对于TIMESTAMP列,插入的NULL值会被CURRENT_TIMESTAMP替代。
  • 对于myisam引擎,null值占用额外的存储空间(1bit),空字符串则完全不占用空间。
  • 对于索引查询的影响,无论是NULL还是空字符目前的测试结果表明都没有太大区别,这点与oracle中is null的查询可能会导致全表扫描不一样。
  • 以上提到的关于NULL值的分组、聚合等,基本都适用于空字符。
在实际工作中建议将空值列全部设为NULL,而不是\'\',因为很多情况下null都会比空字符好处理,空字符还可能引发各种混淆。
此外关于空字符和NULL值对于索引的影响,可以参考https://www.cnblogs.com/leohahah/p/8425813.html

以上是关于Mysql的NULL和Empty String的主要内容,如果未能解决你的问题,请参考以下文章

string、Empty和null三者的区别

C#中null""string.empty区别

C# string总结

C# string总结

NULL,"",String.Empty三者在C#中的区别

ShiroWildcard string cannot be null or empty. Make sure permission strings are properly formatted(代码