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