本文基於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