昨天早上发现日志中有错误信息:Integer到String类型转换异常。
由于程序问题,导致数据库中的varchar列存入的json字符串不符合要求,这些json字符串在反序列化成Map<String,String>之后就会报错。
现在要修改不合法数据。比如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条件和结束符;最后交给客户端批量执行。
几百条数据有问题,如果自己手工改,肯定早就改完了。不过掌握此种方法,以后类似的问题就容易多了。
分享到:
相关推荐
7. 条件和后向引用:在正则表达式中使用条件和捕获组。 8. 预查和后顾:(?=...)和(?)用于正向和负向预查。 【Smarty模板引擎】 Smarty是一个流行的PHP模板引擎,旨在将HTML设计与PHP代码分离,提高代码的可维护性...
下面分别介绍如何在这些语言中使用该正则表达式来移除MySQL脚本中的外键定义。 ##### PHP示例 ```php $script = "CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT ...
MySQL 命令大全 MySQL 是一种关系型数据库...MySQL 命令大全提供了 MySQL 使用和管理的详细指南,涵盖了 MySQL 登录、用户管理、数据库管理、数据操作、数据类型、LIKE 子句、正则表达式、数据导出和导入等多个方面。
- 正则表达式:在MySQL中的应用,以及如何进行复杂的数据匹配和过滤。 4. **查询与事务** - SELECT语句:复杂的查询操作,如JOIN、子查询、联接、聚合函数等。 - 事务处理:ACID属性(原子性、一致性、隔离性、...
1.2 关于本手册 1.2.1 本手册中使用的约定 1.3 MySQL的历史 1.4 MySQL的主要特征 1.5 MySQL稳定性? 1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 ...
+ 1.2.1 本手册中使用的约定 o 1.3 MySQL的历史 o 1.4 MySQL的主要特征 o 1.5 MySQL稳定性? o 1.6 顺应2000年 o 1.7 SQL一般信息和教程 o 1.8 有用的MySQL相关链接 * 2 MySQL 邮件列表及如何提问或报告错误...
- MySQL的`DEFAULT`关键字在PostgreSQL中保持不变,但某些数据类型的默认值可能需要调整,如日期时间类型的默认值。 5. 存储引擎: - MySQL有多种存储引擎,如InnoDB、MyISAM等,而PostgreSQL只有一个内置引擎,...
7. **字符串和正则表达式**:掌握字符串处理函数,如查找、替换、分割等,以及正则表达式的使用,用于复杂的数据匹配和处理。 8. **HTTP与表单处理**:学习如何处理HTTP请求,接收并解析表单数据,以及发送响应。 ...
### MySQL入门知识点详解 #### 一、数据库概述 1. **数据存储方式**: - 数据库是组织、存储和...以上是MySQL入门阶段的一些基础知识点,通过这些内容的学习,可以帮助初学者快速掌握MySQL的基本操作和使用技巧。
正则表达式匹配则使用`regexp`。 存储过程和函数是MySQL中增强数据库功能的重要工具,它们允许我们封装复杂的SQL逻辑并重复使用。存储过程可以接受参数,执行一系列操作,并可能返回结果。触发器则在特定事件(如...
REGEXP是正则表达式模式匹配,允许在搜索值的任何位置查找匹配的模式。 11. CHAR与VARCHAR的区别: CHAR列长度是固定的,存储时会用空格填充到指定长度,检索时需要删除尾随空格。VARCHAR列存储时长度可变,从2个...
- 数据类型:了解MySQL中的各种数据类型,如INT、VARCHAR、DATE等。 - 表的创建与管理:学习如何创建、修改和删除表,以及设置约束和索引。 - 查询操作:熟练使用SELECT语句进行复杂查询,包括JOIN、WHERE子句、...
首先,数据类型定义了存储在数据库中的数据的格式,如整数(INT)、字符串(VARCHAR)、日期和时间(DATETIME)等。理解这些数据类型对于创建高效、准确的数据库至关重要。 数据库是存储数据的逻辑容器,你可以将其...
5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的...
5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 ...
在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中...
10. **REGEXP**:在MySQL中,REGEXP是正则表达式匹配操作符,用于在字符串中查找匹配的模式。 11. **CHAR与VARCHAR的区别**:CHAR是定长字符串,空间预先分配,不足部分用空格填充,检索时去除尾部空格;VARCHAR是...
5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....
5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....