昨天早上发现日志中有错误信息: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只有一个内置引擎,...
5.12.3. 在多服务器环境中使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL中的复制 6.1....
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中的...
在MySQL中,数据类型的选择至关重要,因为它直接影响到数据的存储空间、处理效率以及查询性能。以下是关于MySQL数据库设计的一些关键知识点: 1. **字符串转义序列**: 在MySQL中,字符串可能包含特殊字符,如NUL...
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是...