今天開始,把文章全部發到專欄里

今天給大家,帶來的例子是 MySQL Join過程中發生隱士轉換導致結果跟預期的不一樣的問題。

下面是 即將使用的表和插入數據的 腳本

create table a (nntx_no int ) ;
create table b (nntx_no varchar(20) ) ;
root@mysql3306.sock>[test]>insert into a values (1772 ) ;
Query OK, 1 row affected (0.00 sec)
root@mysql3306.sock>[test]>insert into a values (1773 ) ;
Query OK, 1 row affected (0.00 sec)
root@mysql3306.sock>[test]>insert into b values (1772 ) ;
Query OK, 1 row affected (0.00 sec)
root@mysql3306.sock>[test]>insert into b values (1772.0 ~ 34 ) ;
Query OK, 1 row affected (0.01 sec)

下面是表數據

root@mysql3306.sock>[test]>select * from a ;
+---------+
| nntx_no |
+---------+
| 1772 |
| 1773 |
+---------+
2 rows in set (0.00 sec)
root@mysql3306.sock>[test]>select * from b ;
+-------------+
| nntx_no |
+-------------+
| 1772 |
| 1772.0 ~ 34 |
+-------------+
2 rows in set (0.00 sec)

運行如下SQL

select a.nntx_no, b.nntx_no
-> from a
-> left join b on a.nntx_no = b.nntx_no
-> where 1=1
-> and a.nntx_no = 1772;
+---------+-------------+
| nntx_no | nntx_no |
+---------+-------------+
| 1772 | 1772 |
| 1772 | 1772.0 ~ 34 |
+---------+-------------+

可以看到出了 兩行數據,但是其中第二行數據 顯然不符合我們的預期

但MySQL卻給我們了一個看似錯誤的結果!!!

現在我們來分析,這個結果的原因

[email protected]>[test]>select a.nntx_no, b.nntx_no
-> from a
-> left join b on a.nntx_no = b.nntx_no
-> where 1=1
-> and a.nntx_no = 1772;
+---------+-------------+
| nntx_no | nntx_no |
+---------+-------------+
| 1772 | 1772 |
| 1772 | 1772.0 ~ 34 |
+---------+-------------+
2 rows in set, 2 warnings (0.00 sec)
[email protected]>[test]>show warningsG
*************************** 1. row ***************************
Level: Warning
Code: 1292
Message: Truncated incorrect DOUBLE value: 1772.0 ~ 34
*************************** 2. row ***************************
Level: Warning
Code: 1292
Message: Truncated incorrect DOUBLE value: 1772.0 ~ 34
2 rows in set (0.00 sec)

從show warnings 中 可以看出一些端倪 有兩個warning

顯示 Truncated incorrect DOUBLE value: 1772.0 ~ 34

說明 1772.0 ~ 34 轉換過程中,被截斷了

我們坐下如下實驗

[email protected]>[test]>select 1772.0 ~ 34 + 0 ;
+-------------------+
| 1772.0 ~ 34 + 0 |
+-------------------+
| 1772 |
+-------------------+

說明 1772.0 ~ 34 字元串轉換成數字的過程中 被轉換成1772 所以MySQL 給我們

得出了上面的結果!

那原因,已經知道了 剩下的就是怎樣處理了!

我們從上面的結果中已經知道,原因是字元串變成數字的過程中被截取導致的,

那解決方案就是,不進行數字類型轉換就可以了。

如下所示,用了 concat(a.nntx_no,) 使數字類型變成字元串類型,從而字元串=字元串

這樣就可以了 !!!

[email protected]>[test]>select a.nntx_no, b.nntx_no
-> from a
-> left join b on concat(a.nntx_no,) = b.nntx_no
-> where 1=1
-> and a.nntx_no = 1772;
+---------+---------+
| nntx_no | nntx_no |
+---------+---------+
| 1772 | 1772 |
+---------+---------+
1 row in set (0.00 sec)

以上就是,今天的內容

謝謝大家~ 歡飲轉發

我是知數堂SQL 優化班老師~ ^^

如有關於SQL優化方面疑問和一起交流的請加 並且 @兔子@知數堂SQL優化

高性能MySQL,SQL優化群 有葉金榮,吳炳錫 兩位大神坐鎮 : 579036588

歡迎加入 知數堂大家庭


推薦閱讀:
相关文章