理解:MySQL的null與空字串的不同
MySQL的null與空字串:
搞過Oracle的人,常常會對MySQL的null與空字串''搞錯。
在Oracle裡:null 與 ''是等價的。
15:02:40 sql>create table test(v varchar2(10));
15:02:46 sql>insert into test values('');
15:03:07 sql>insert into test values(null);
15:03:12 sql>commit;
15:04:05 sql>select count(1) from test where v is null;
COUNT(1)
----------
2
15:04:07 sql>select count(1) from test where v ='';
COUNT(1)
----------
0
15:04:41 sql>select count(1) from test where v <>'';
COUNT(1)
----------
0
注意:Oracle中null僅只能參與is null 和 is not null運算。如何使用 <> 、= 與null進行比較,都會返回false。
但在MySQL裡,null與 ''是完全不同的:NULL是指沒有值,而''則表示值是存在的,只不過是個空值。
見如下實驗:
mysql> create table test (v varchar(10));
ERROR 1050 (42S01): Table 'test' already exists
mysql> drop table test;
Query OK, 0 rows affected (0.11 sec)
mysql> create table test (v varchar(10));
Query OK, 0 rows affected (0.11 sec)
mysql> insert into test values(null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values('');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+
| v |
+------+
| NULL |
| |
+------+
2 rows in set (0.00 sec)
mysql> select count(1) from test where v is null;
+----------+
| count(1) |
+----------+
| 1 |
+----------+
1 row in set (0.04 sec)
mysql> select count(1) from test where v = '';
+----------+
| count(1) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
再看看MySQL在時間型別欄位上是如何處理null與''
mysql> create table t_date (d timestamp);
ERROR 1050 (42S01): Table 't_date' already exists
mysql> drop table t_date;
Query OK, 0 rows affected (0.12 sec)
mysql> create table t_date (d timestamp ,d2 datetime);
Query OK, 0 rows affected (0.14 sec)
mysql> insert into t_date values(null,null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_date;
+---------------------+------+
| d | d2 |
+---------------------+------+
| 2014-02-19 15:42:11 | NULL |
+---------------------+------+
1 row in set (0.00 sec)
注:timestamp型別插入null,卻插入了系統當前時間
mysql> desc t_date;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| d | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| d2 | datetime | YES | | NULL | |
+-------+-----------+------+-----+-------------------+-----------------------------+
原來MySQL給自動給timestamp型別增加了預設值而不能為null。
mysql> insert into t_date (d) values ('');
ERROR 1292 (22007): Incorrect datetime value: '' for column 'd' at row 1
mysql> insert into t_date (d2) values ('');
ERROR 1292 (22007): Incorrect datetime value: '' for column 'd2' at row 1
時間欄位不能插入''。
mysql> select @@version;
+------------------+
| @@version |
+------------------+
| 5.6.14-ndb-7.3.3 |
+------------------+
1 row in set (0.00 sec)
不同版本的MySQL對時間欄位的處理不一樣,有的版本會把''轉換為'0000-00-00 00:00:00'插入到表中。
而且相同版本不同的命令也可能不一樣。
在我的實驗中,使用load data 匯入文字檔案時,就發生了''轉換為'0000-00-00 00:00:00'儲存到表中。
附:
使用load data進行匯入資料的時候,沒有資料的欄位插入的不是null,而是'';為了能插入null,在文字檔案中使用'\N'來代表null。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/195110/viewspace-1084061/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql中null與“空值”的坑MySqlNull
- mysql 空值(null)和空字元('')的區別MySqlNull字元
- 快速理解MySQL null的10大坑MySqlNull
- Java與眾不同的字串-String類Java字串
- 字串大小的不同求法與區別字串
- 記錄一次laravel 會把空字串轉為 null的小坑Laravel字串Null
- Innodb 下null '' ' '的儲存表現的不同Null
- js判斷輸入字串是否為空、空格、null總結JS字串Null
- 實習記錄day02:MySQL是有null和空的區別的MySqlNull
- MYSQL timestamp NOT NULL插入NULL的報錯問題MySqlNull
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- 大神教你如何判斷Python中字串是否為空和nullPython字串Null
- MySQL與SQL的觸發器的不同寫法MySql觸發器
- MySQL NULLMySqlNull
- MySQL NOT NULL列用 WHERE IS NULL 也能查到資料的原因MySqlNull
- MySQL 的 NULL 值是怎麼儲存的?MySqlNull
- MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯!MySqlNull索引
- MySQL-去掉不為null的欄位MySqlNull
- MySQL null和''分析MySqlNull
- 使用Spring 的 Null-Safety免受空指標錯誤SpringNull指標
- PostgreSQLoracle相容性-字串內嵌NULL字元(空字元)chr(0)轉換為chr(32)SQLOracle字串Null字元
- MySQL null值儲存,null效能影響MySqlNull
- MySQL 中的共享表空間與獨立表空間如何選擇MySql
- MYSQL 一個特殊需求在不同的MYSQL配置產生不同的結果 與 update 0 是否需要應用程式判斷MySql
- NULL在oracle和mysql索引上的區別NullOracleMySql索引
- MySQL不同儲存引擎的資料備份與恢復MySql儲存引擎
- undefined與null與?. ??UndefinedNull
- java中判斷String型別為空和null的方法Java型別Null
- .NET Core 處理 WebAPI JSON 返回煩人的null為空WebAPIJSONNull
- mysql 的Escape轉義字串MySql字串
- 資料庫系統 空值 null資料庫Null
- null與indexNullIndex
- Kotlin 字串教程:深入理解與使用技巧Kotlin字串
- MySQL null值欄位是否使用索引的總結MySqlNull索引
- 今天測試了一下mysql的Null值MySqlNull
- NullPointerException空指標異常的理解NullException指標
- in、exists操作與null的一點總結Null
- PHP如何替換多個字串不同位置不同長度的子串PHP字串
- TreeSet的null值與元素型別的約束Null型別