今天一大早客戶給我打電話:“小陳兒乔宿,昨晚我往數(shù)據(jù)庫導(dǎo)了幾十萬條數(shù)據(jù),然后在web界面很多都搜不到访雪,你們系統(tǒng)做的啥玩意兒跋耆稹?這么多BUG臣缀!得啵得啵得…”(省略2000字)又習(xí)慣性的噴了一遍我們這個(gè)項(xiàng)目做的辣雞~~
??得得得坝橡,客戶隨便噴,我就當(dāng)吃了個(gè)早飯了??????嗝兒~嗯精置,真飽计寇;
對(duì)了,沒時(shí)間廢話脂倦,等米下鍋的朋友請(qǐng)點(diǎn)擊目錄直接跳轉(zhuǎn)到方法操作區(qū)
我到公司后先測(cè)試一下客戶給我的錯(cuò)誤示例(果然搜不到)番宁,然后排查一下昨天的數(shù)據(jù)是否有問題,發(fā)現(xiàn)昨天客戶用excel導(dǎo)入的數(shù)據(jù)中赖阻,存在很多\r\n這種換行符和回車符蝶押。
如:庫中數(shù)據(jù)為:“換行符\n換行符\n換行符”,然后在界面通過如下SQL查詢政供,那自然是搜不到咯播聪!
SELECT * from `LOL` where name = '換行符換行符換行符';
換行符:
CHAR(10) = "\n"
回車符:
CHAR(13) = "\r"
在MySQL中,回車符布隔、換行符都屬于char類型离陶,放到varchar中時(shí),在navcat等插件上是不顯示的衅檀,需要在mysql終端和navcat對(duì)比才能看出來(坑啊~)
navcat插件顯示如下:
MySQL終端顯示如下:
(回車符\r還導(dǎo)致數(shù)據(jù)結(jié)果直接返回了招刨,只顯示了一部分,MySQL你讓我說你啥好????)
mysql> select * from `LOL`;
+----+-------------------------------+-----------+-------+
| id | hero_title | hero_name | price |
+----+-------------------------------+-----------+-------+
| 1 | D刀鋒之影 | 泰隆 | 6300 |
| 2 | X迅捷斥候 | 提莫 | 6300 |
| 8 | 換行符
換行符
換行符 | 換行符 | 450 |
回車符 | 回車符 | 450 |
+----+-------------------------------+-----------+-------+
4 rows in set (0.00 sec)
1哀军、如何去掉換行符沉眶、回車符
如果條件允許,建議直接通過語句清除掉換行符和回車符杉适,如下:
去除"hero_title"列中所有換行符 (通過以下兩種方式都可以)
-- 去除"hero_title"列中所有換行符 (通過以下兩種方式都可以)
update `LOL` set hero_title = REPLACE(hero_title, '\n', '');
update `LOL` set hero_title = REPLACE(hero_title, char(10), '');
– 去除"hero_title"列中所有回車符(通過以下兩種方式都可以)
-- 去除"hero_title"列中所有回車符
update `LOL` set hero_title = REPLACE(hero_title, '\r', '');
update `LOL` set hero_title = REPLACE(hero_title, char(13), '');
2谎倔、SELECT如何忽略"換行符、回車符"進(jìn)行查詢
如果條件不允許猿推,比如客戶“很激動(dòng)”并向你吼道:不能動(dòng)庫里的數(shù)據(jù)片习!…我笑了~
那怎么辦呢?可以通過修改SQL來過濾掉換行符蹬叭、回車符藕咏,但一定程度上會(huì)影響查詢效率,而且要改很多代碼秽五,你懂得孽查。
銘記魯迅先生說的:哪里有壓迫,哪里就得有反抗坦喘!
示例如下:
-- 忽略掉換行符查詢
SELECT * from `LOL` where REPLACE(hero_title, char(10), '') = '換行符換行符換行符';
-- 忽略掉回車符查詢
SELECT * from `LOL` where REPLACE(hero_title, char(13), '') = '回車符回車符回車符';
-- 忽略掉換行符 & 回車符查詢
SELECT * from `LOL` where REPLACE(REPLACE(hero_title, char(13), ''), char(10), '') = '回車符回車符回車符';
3盲再、經(jīng)驗(yàn)總結(jié)
類似的符號(hào)一般要求入庫時(shí)就清理掉,如果必須保留也建議用其他自定義標(biāo)識(shí)代替(如自創(chuàng)的唯一標(biāo)識(shí)瓣铣,我叫它大眼瞪小眼: o_O)洲胖,后臺(tái)程序中做替換處理,免得影響到索引效率坯沪。
??好了绿映,希望這篇文章能幫到你,或許你可以mark一下腐晾,當(dāng)同事遇到該問題時(shí)叉弦,甩她臉上~