關(guān)于mysql中string和number的轉(zhuǎn)換問題
mysql中string和number的轉(zhuǎn)換
今天無意中發(fā)現(xiàn)一個很奇怪的現(xiàn)象,在寫sql語句的時候,想篩選列值為空字符串的記錄,結(jié)果把列值為0的記錄也一起篩選出來了
總結(jié)原因如下
當(dāng)非同類型比較,等號兩邊分別為number和string之一時候,mysql會把string類型和number類型進(jìn)行轉(zhuǎn)換:
(1)數(shù)值型字符串
如''、'string'、'abc'等,會轉(zhuǎn)換成0
eg:
select '' = 0 from dual; ? ---結(jié)果:1 select 'a' = 0 from dual; ? ---結(jié)果:1
(2)number和string拼接字符串
如'123string'、'0123string'等,會取頭部類型進(jìn)行轉(zhuǎn)換
eg:
select '123abc' = 0 from dual; ? ---結(jié)果:0 select '123abc' = 123 from dual; ? ---結(jié)果:1 select '0123abc' = 123 from dual; ? ---結(jié)果:1 select '123abc' + '23def' from dual; ? ---結(jié)果:146
(3)string和number拼接字符串
如'string123'、'string0123'等,會取頭部類型進(jìn)行轉(zhuǎn)換
eg:
select 'abc123' = 0 from dual; ? ---結(jié)果:1 select 'abc123' = 123 from dual; ? ---結(jié)果:0 select 'abc123' + 'def45' from dual; ? ---結(jié)果:0
(4)數(shù)值型字符串則會轉(zhuǎn)換成相應(yīng)的number
如'123'->123、'023'->23等
eg:
select '123' = 0 from dual; ? ---結(jié)果:0 select '123' = 123 from dual; ? ---結(jié)果:1 select '0123' = 123 from dual; ? ---結(jié)果:1
(5)number則直接轉(zhuǎn)換成對應(yīng)的string
eg:
select 123 = '123' from dual; ? ---結(jié)果:1
所以針對我遇到的問題,mysql把''當(dāng)成字符串處理,轉(zhuǎn)換成了0,0=0,所以把列值為0的記錄也一并篩選了出來
+號的處理方式同理:
如果+號兩邊類型不一致,則把string轉(zhuǎn)換成number處理
select '0string' + 0 = 'string' from dual; ? ---結(jié)果:1 ? '0string' + 0 -> 0 + 0 = 0,0和'string'進(jìn)行比較 select 'string' = 'string' + 0 from dual; ? ---結(jié)果:1 ? 'string' + 0 -> 0 + 0 = 0,'string'和0進(jìn)行比較 select 'string' + 0 = 'string' + 0 from dual; ? ---結(jié)果:1 ? 'string' + 0 -> 0 + 0 ,0和0進(jìn)行比較 select 'string' + 0 = 'string' + 1 from dual; ? ---結(jié)果:0 ? 'string' + 0 -> 0 + 0 ,'string' + 1 -> 0 + 1,0和1進(jìn)行比較
參考鏈接:http://stackoverflow.com/questions/22080382/mysql-why-comparing-a-string-to-0-gives-true
附贈mysql文檔說明:https://dev.mysql.com/doc/refman/5.7/en/type-conversion.html
mysql中hex、varchar、number相互轉(zhuǎn)換
hex(‘20')= 14 select HEX(20) from DUAL – result: 14
然后這串?dāng)?shù)字就能變?yōu)?6進(jìn)制字符串,只需要加上0x的前綴!
- UNHEX(‘14’) – 每對十六進(jìn)制數(shù)字轉(zhuǎn)化為一個字符。
- UNHEX(‘14’),對應(yīng) SI, 該字符無法正確輸出
但是ORDER BY UNHEX(‘14’) 是可以的。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mysql limit 優(yōu)化,百萬至千萬級快速分頁 復(fù)合索引的引用并應(yīng)用于輕量級框架
MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考這個問題還是從前天開始。有過痛苦有過絕望,到現(xiàn)在充滿信心!2011-06-06服務(wù)器上的mysql實(shí)現(xiàn)讀取sql文件
這篇文章主要介紹了服務(wù)器上的mysql實(shí)現(xiàn)讀取sql文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03MySQL從MyISAM轉(zhuǎn)換成InnoDB錯誤與常用解決辦法
由于一些程序的要求,需要MyISAM數(shù)據(jù)引擎或InnoDB,下面是具體的解決方法,經(jīng)測試偶爾會出現(xiàn)一些問題。2011-05-05DB為何大量出現(xiàn)select @@session.tx_read_only 詳解
這篇文章主要給大家介紹了關(guān)于DB為何大量出現(xiàn)select @@session.tx_read_only 的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04MySQL?8.0.29?安裝配置方法圖文教程(windows?zip版)
這篇文章主要為大家詳細(xì)介紹了windows?zip版MySQL?8.0.29?安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06MySQL中distinct和count(*)的使用方法比較
這篇文章主要針對MySQL中distinct和count(*)的使用方法比較,對兩者之間的使用方法、效率進(jìn)行了詳細(xì)分析,感興趣的小伙伴們可以參考一下2015-11-11