評“MySQL 隱式轉換引起的執行結果錯誤”
今天看到一篇關於MySQL隱式轉換引發執行結果錯誤的文章:
===========================================================================
今天給大家,帶來的例子是 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卻給我們了一個看似錯誤的結果!!!
現在我們來分析,這個結果的原因
root@mysql3306.sock>[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) root@mysql3306.sock>[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' 轉換過程中,被截斷了
我們坐下如下實驗
root@mysql3306.sock>[test]>select '1772.0 ~ 34' + 0 ; +-------------------+ | '1772.0 ~ 34' + 0 | +-------------------+ | 1772 | +-------------------+
說明 '1772.0 ~ 34' 字串轉換成數字的過程中 被轉換成1772 所以MySQL 給我們
得出了上面的結果!
那原因,已經知道了 剩下的就是怎樣處理了!
我們從上面的結果中已經知道,原因是字串變成數字的過程中被擷取導致的,
那解決方案就是,不進行數字型別轉換就可以了。
如下所示,用了 concat(a.nntx_no,'') 使數字型別變成字串型別,從而字串=字串
這樣就可以了 !!!
root@mysql3306.sock>[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)
以上就是,今天的內容
===========================================================================
這應該算了MySQL的一個Bug吧。
1、從CHAR到INT的轉換,不成功應該要報錯;
2、隱式轉換,應該要保持資料不丟失,即從INT到CHAR的轉換;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-2649269/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檔案格式引起的指令碼執行錯誤指令碼
- mysql隱式轉換問題MySql
- mysql執行函式出現1418錯誤MySql函式
- MySQL索引失效之隱式轉換MySql索引
- oracle執行計劃------未走索引,隱式轉換的坑Oracle索引
- MySQL主從複製錯誤——列型別轉換錯誤MySql型別
- js顯式轉換和隱式轉換JS
- java隱式轉換Java
- javascript 隱式轉換JavaScript
- sql隱式轉換SQL
- Scala Essentials: 隱式轉換
- [20191106]隱式轉換.txt
- [] == ![],走進==隱式轉換的世界
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- 阻止a標籤的跳轉,a標籤自動跳轉引起的錯誤
- 瞭解MySQL的隱式轉化MySql
- hadoop(二)—hadoop配置、執行錯誤總結Hadoop
- JavaScript隱式型別轉換JavaScript型別
- 【C++】禁止隱式轉換C++
- 執行錯誤集
- Spark中的三種隱式轉換Spark
- 突然斷電,是否會影響Mysql的執行結果MySql
- JS隱式轉換--寬鬆相等(==)JS
- C語言的隱式型別轉換C語言型別
- [20220811]奇怪的隱式轉換問題.txt
- '2'>'10'==true? JS是如何進行隱式型別轉換的?JS型別
- 記憶體拷貝引起的錯誤記憶體
- 建構函式定義的隱式型別轉換函式型別
- Solidity語言學習筆記————11、隱式轉換和顯式轉換Solid筆記
- Cris 的 Scala 筆記整理(十):隱式轉換筆記
- c++隱式型別轉換存在的陷阱C++型別
- JavaScript 隱式資料型別轉換JavaScript資料型別
- oracle資料隱式轉換規則Oracle
- 如何實現隱式型別轉換型別
- mysql 字串和數字比,字串會隱式轉換為數字0MySql字串
- MySQL基礎:搭建bc網站sql執行錯誤時的控制方式MySql網站
- PbootCMS錯誤提示:執行SQL發生錯誤!錯誤:no such column: def1bootSQL
- 執行SQL發生錯誤!錯誤:disk I/O errorSQLError