String sql = "select 'insert into " + tableName + " values ( '"; int count=0; int counts=0; //获得列的总数 while (rs.next()) { count++; } //重新获得列数据 整理成sql rs = metadata.getColumns(null, null, tableName, "%"); //得到表的字段列表 while (rs.next()) { counts++; if(counts<=count) { Object colName = rs.getObject("column_name"); sql += " ||'''' ||" + colName + "|| ''','"; } } sql=sql.substring(0,sql.length()-2)+"'"; sql += " || ' );' from " + tableName+ where; rs.close(); // System.out.println("DEBUG: SQL="+sql); //执行 statement = conn.createStatement(); rs = statement.executeQuery(sql); //将SQL语句放到List中 list=new ArrayList<Object>(); while (rs.next()) list.add(rs.getObject(1)); rs.close();
上面是我的部分代码,我想要导出表中的数据,但是有些数据中本身包含sql语句,如果sql语句中有单引号的话怎么转义呢?
例如:insert into T02_TP_EXEC_QRY_SEQ values ( '20180417143','20180417145','select username from t00_user where username='admin'' );
admin导出应该是''admin''的格式
没有想到更好的办法,最后自己用正则表达式替换了一下:Pattern p = Pattern.compile("'\\s*[select|SELECT].+'");
where username=' ' 'admin' ' '
两个单引号表示一个单引号,中间的空格是我故意加入的。
第一个单引号是外部的,表示里面是个字符串,第二个单引号和第三个单引号表示一个单引号。后面也是类似。
实际写起来是这样的 username='''admin'''
上面给的例子是我要导出的结果,我的意思是怎么在导出结果的时候就对单引号进行转义
@seeusmile: 这是不合理的,不要动数据,因为你不知道他会用在什么地方。
数据应该保持他原始的状态,而不是为了你的用途修改他,
比如说,如果你用其他方法导入数据而不是用这么土的拼接字符串,那么单引号根本不是问题。
需求就是我想把A数据库的指定表数据导出成.sql文件,然后直接执行sql文件导入到B数据库中,但是有些表中的数据本身带了单引号,如果不进行转义就执行不了。
@seeusmile: 那你的问题是什么呢?不是已经说了,一个单引号变成两个就行了。
@爱编程的大叔: 我想问一下有没有替换符在执行rs = statement.executeQuery(sql);的时候就进行转换,不需要我再进行手动替换。
比如我在这里拼接的时候sql += " ||'''' ||" + colName + "|| ''','"; 是不是可以换一种写法?