mysql错误修改数据_使用正则表达式快速修改mysql中错误的varchar类型数据
昨天早上發現日志中有錯誤信息:Integer到String類型轉換異常。
由于程序問題,導致數據庫中的varchar列存入的json字符串不符合要求,這些json字符串在反序列化成Map之后就會報錯。
現在要修改不合法數據。比如goods表的desc列
//當前格式
{"name":"aaa","age":24,"height":1.73}
{"name":"bbb","age":30,"weight":65.20}
//目標格式
{"name":"aaa","age":"24","height":"1.73"}
{"name":"bbb","age":"30","weight":"65.20"}
1、如何查出有問題的數據?
因為json數據并不規范,直接使用like查詢不太現實,主要是分支有點多。
數據的共同問題就是數字沒有被引號包圍。所以只需要查出冒號:之后直接是數字的數據。
查詢MysqL的文檔之后,使用如下SQL查詢:
select * from goods where desc regexp ':[[:digit:]]+'
select * from goods where desc regexp ':[[:digit:]]+\\,'這個沒用
MysqL的正則表達式跟perl、unix風格的有較大的差異。其中[[:digit:]]表示數字。 \\,用來匹配json中的逗號
2、如何修改有問題的數據?
直接用MysqL修改?那就要把符合條件的數字(組)提取出來,粗略查了下文檔,沒查到,放棄。
用UE(UltraEdit)編輯器修改。UE支持三種正則表達式:Perl、Unix、和UE。
如何查詢?以前常用Unix風格的正則表達式查詢沒問題,UE風格正則請參考文檔,有點弱。
如何替換?這才最關鍵。要替換就得提取匹配的組。如何提取?UE的幫助文檔如是說:
^(*^)
在表達式加上括號或標簽在替換命令中使用。正則表達式中可以有 9 個表達式標簽,數字根據它們在正則表達式中的次序確定數字。
相應的替換表達式是 ^x,x 的范圍是 1-9。例如: 如果 ^(h*o^) ^(f*s^) 匹配“hello folks”,那么^2 ^1 表示將用“folks hello”替換它。
也就是說,用^(*^)這貨來查找,用^1引用第一個組,^2引用第二個組。 例子里,^2引用了folks,^1引用了hello。
對于我遇到的問題
首先,要匹配數字,最簡單的[0-9],+表示至少1個,++表示0個或多個,[.]匹配小數點。所以匹配整數和小數可以用[0-9]+[.]++[0-9]++。因為后面要提取數字,所以用^([0-9]+[.]++[0-9]++^)
其次,出錯的數據都是冒號后面直接帶數字。所以表達式為:^([0-9]+[.]++[0-9]++^)。這樣就把正確數據和錯誤數據區分了。
再次,如果要匹配key比如age、weight,用^("[~"]+"^):^([0-9]+[.]++[0-9]++^)。[~"]匹配引號以外的字符。這樣的話,想干點什么就方便多了,比如根據json生成表格。
然后,打開查找對話框,選中正則表達式,點開高級,選正則表達式引擎為UltraEdit,查找表達式^("[~"]+"^):^([0-9]+[.]++[0-9]++^),替換表達式^1 :"^2",點擊替換。 最后,替換完了,使用列編輯模式生成udpate語句,帶上where條件和結束符;最后交給客戶端批量執行。 幾百條數據有問題,如果自己手工改,肯定早就改完了。不過掌握此種方法,以后類似的問題就容易多了。
總結
如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。
本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。
如您喜歡交流學習經驗,點擊鏈接加入交流1群:1065694478(已滿)交流2群:163560250
總結
以上是生活随笔為你收集整理的mysql错误修改数据_使用正则表达式快速修改mysql中错误的varchar类型数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos安装mysql密码_cent
- 下一篇: mysql食堂系统E R图_教务管理系统