今天运行壹個小程序,功能是读取指定目录下的 SQL 脚本,并加载到内存中批量执行,之前的程序运行良好。但是今天相关开发人员更新了其中壹個 SQL 脚本,于是程序运行的时候就出错了,错误提示信息如下:批处理中出现错误: ORA-01756: 引号内的字符串没有正确结束。用 Notepad++ 打开看了下 SQL 脚本,没有发现明显的语法错误,再仔细找了找包含单引号和双引号的语句,也没有看到语句未正确结束的地方。于是有点困惑,开始启动 Eclipse 的 Debug 模式仔细分析,并调低了日志级别到
DEBUG,将所有解析出来的 SQL 语句打印至控制台。
结果在日志中发现有的 SQL 语句解析之后居然是乱码,截取部分内容如下所示:
4,2,'?占淇迹罩湛贾? from TRUSTDB.TRUST_PRDT_MEM_SET t
很明显的,数字2后面的部分只有壹個开始的单引号,而没有关闭的单引号,看来极有可能是这段乱码引起的,上述内容在原始的 SQL 文件(GBK 编码)中实际是这样的:
4,2,'日间开始,日终开始之前' from TRUSTDB.TRUST_PRDT_MEM_SET t
不知道为什么经过 Java 解析之后会变成壹串乱码。找到问题的所在,修改的时候直接把“日间开始,日终开始之前”中间的全角逗号改成了半角逗号,问题就宣告解决,同时我还注意到在这個 SQL 脚本中,还有其它地方也使用到了全角的逗号,但是那些地方没有出问题,独独此处报错了,真是奇怪。在我看来,这個修复方法实在不太理想,不知道是否还有更好的方法。另外,附上我的
SQL 文件解析代码如下。
List<String> loadSql(String filepath) throws Exception {
List<String> sqls = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
byte[] buff = new byte[1024];
int byteRead = 0;
LOGGER.debug("Start parse sql file [" + filepath + "].");
InputStream sqlFileIn = ClasspathResourceLoader.getResourceAsStream(filepath);
//开始读取文件内容
while ((byteRead = sqlFileIn.read(buff)) != -1) {
sb.append(new String(buff, 0, byteRead));
}
//将读取到的字符串以换行符分割
String[] sqlArr = sb.toString().split("(;\\s*\\r\\n)|(;\\s*\\n)");
for (int i = 0; i < sqlArr.length-1; i++) {
//将每個独立语句中的注释和末尾的分号去掉,只保留语句内容
String sql = sqlArr[i].replaceAll("--.*", "").replaceAll(";", " ").trim();
if (!sql.equals("")) {
sqls.add(sql);
}
}
LOGGER.debug("sql list=" + sqls);
return sqls;
}
目前这個问题暂存,待日后有更好的方法时我会回过头来继续补充完善。
分享到:
相关推荐
对全角半角字符串的处理,对全角半角字符串的处理,对全角半角字符串的处理
应用Microsoft SQL Server 7.0要注意全角(中文)逗号的使用.pdf
使用全角字符和ANSI代码截断字符串。 特征 没有猴子修补String类 从开头,中间,结尾或两端省略文本 考虑UTF-8,EUC-JP等编码中的全角字符 缩短单词之间没有空格的文本(中文,日文,韩文等) 保留ANSI转义码 内容...
用全角字符和ANSI代码包装字符串。 特征 没有猴子修补String类 考虑UTF-8,EUC-JP等编码中的全角字符 自动换行,单词之间不留空格(中文,日文,韩文等) 保留ANSI转义码 安装 将此行添加到您的应用程序的Gemfile...
解决PB无法直接识别全角空格问题,特写该函数,将字符串中的全角空格替换为半角空格。
全角字符转为半角字符的算法: 全角字符 - 半角字符 = 0xA380 全角空格A1A1 -> 半角空格0x20 附件为C源程序
C#实现字符串全角半角转换类
可以实现字符串的全角到半角及半角到全角的转换,还是挺方便的,不对空格以及ascii表中其他可见字符之外的字符做任何处理,可以运行
全角字符从的unicode编码从65281~65374 半角字符从的unicode编码从 33~126 空格比较特殊,全角为 12288,半角为 32 而且除空格外,全角/半角按unicode编码排序在顺序上是对应的 所以可以直接通过用+-法来处理非空格...
│ 得到一个字符串在另一个字符串中出现的次数.sql │ 数字转换成十六进制.sql │ 比较第一与第二个字符串,是否有连续的5个字符相同.sql │ 生成查询的模糊匹配字符串.sql │ 简繁转换.sql │ 统计一个表中某个字符...
全角转半角,半角转全角,全角半角字符串转换工具类Character.java
解决任何情况下的全角、半角字符转化问题,有效的控制程序中出现全角半角问题。方法简单,易懂。
可拆分由任意个全角或半角空格分隔开的任意长度的字符串,主要用数据库编程中多个关键字模糊查询时使用。
ZWC的常用用法包括对机密文本进行指纹识别,嵌入隐藏文本并从字符串匹配(即正则表达式)中转义... lib受到这篇出色的启发,并具有以下功能: :hundred_points: 稳定并涵盖完整的测试用例 :grinning_squinting_...
气候截断在终端中将字符串截断为特定宽度优雅地处理。 像用造型的弦子。 它还支持Unicode代理对和全角字符。安装 $ npm install cli-truncate用法 const cliTruncate = require ( 'cli-truncate' ) ;cliTruncate ( '...
半角与全角字符的转换
判断是否存在中文和全角字符 str.match(/[^\x00-\xff]/ig) 判断包含中文字符串长度 aMatch=str.match(/[^\x00-\x80]/g); str.length+(!aMatch?0:aMatch.length) javascript 判断中文字符长度 一种: 代码如下: ...
字符串,标点符号全角半角之间的相互转换。非常实用
num = "1" #unicodeprint(num.isdigit()) # Trueprint(num.isdecimal()) # Trueprint(num.isnumeric()) # Truenum = "1" # 全角print(num.isdigit()) # Trueprint(num.isdecimal()) # Trueprint(num.isnumeric()) # ...
} * {box-sizing:border-box} / *全角输入字段* / input [type = text],input [type = password] {宽度:100%; 内边距:15px; 边距:5px 0 22px 0; 显示:inline-block; 边界:无; 背景:#f1f1f1; } / *当输入...