今天运行壹個小程序,功能是读取指定目录下的 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;
}
目前这個问题暂存,待日后有更好的方法时我会回过头来继续补充完善。
分享到:
相关推荐
例如,如果你有一个字段用于存储包含中文字符的字符串,而该字符串中包含了全角逗号,那么在使用逗号作为分隔符进行字符串处理(如Split函数)时,可能会导致分割错误,因为SQL Server会将全角逗号视为一个单独的...
### 对全角半角字符串的处理 在计算机编程与数据处理领域中,全角和半角字符的区别及其转换是一项常见的需求。特别是在东亚语言环境中(如中文、日文、韩文等),这种转换对于文本处理至关重要。 #### 全角与半角...
在IT领域,特别是编程与文本处理中,全角与半角字符的转换是一个常见的需求,尤其是在东亚语言环境中,如中文、日文、韩文中。全角(Full Width)与半角(Half Width)字符的区别主要在于宽度和编码上。半角字符通常...
- 用途:用于计算字符串中全角字符的数量。 - 示例:`"abcABC123456".len()` 返回 `12` - **空行匹配**:`\n[\s|]*\r` - 用途:用于匹配空行。 - 示例:`"\n\r"` - **HTML标签**:`/<(.*)>.*|<(.*)\/>` - ...
Go-UNIS是一个针对Go语言设计的字符串处理库,它提供了丰富的字符串操作工具类,旨在帮助开发者更加高效、便捷地处理日常编码中的字符串任务。在Go语言中,字符串操作是常见的编程需求,而Go-UNIS则通过提供一系列预...
使用全角字符和ANSI代码截断字符串。 特征 没有猴子修补String类 从开头,中间,结尾或两端省略文本 考虑UTF-8,EUC-JP等编码中的全角字符 缩短单词之间没有空格的文本(中文,日文,韩文等) 保留ANSI转义码 内容...
本文将详细介绍如何解决SQL Server 2005中表列中的主键遇到全角字符时的问题,并提供具体的解决方案。 #### 全角字符简介 全角字符是指在东亚语言环境中使用的一种字符类型,其宽度为一个汉字的宽度。与之相对的是...
在C#编程中,正则表达式是一种非常强大的文本处理工具,可以用于字符串搜索、替换等操作。本文将详细介绍一系列常用的正则表达式,并结合C#中的实际应用进行说明。 #### 数字相关的正则表达式 1. **匹配任意数字**...
用全角字符和ANSI代码包装字符串。 特征 没有猴子修补String类 考虑UTF-8,EUC-JP等编码中的全角字符 自动换行,单词之间不留空格(中文,日文,韩文等) 保留ANSI转义码 安装 将此行添加到您的应用程序的Gemfile...
正则表达式(Regular Expression)是一种用于匹配字符串中字符组合的强大工具。它广泛应用于搜索、替换以及数据验证等场景。在文本处理、表单验证、数据清洗等领域都有着极其重要的应用。 ### 常用正则表达式 1. *...
6. **编码问题**:处理包含全角字符的字符串时,需要确保在整个处理过程中保持正确的字符编码,防止乱码问题。 总之,“Split”操作在编程中扮演着重要角色,特别是在涉及到用户输入、数据解析和数据库查询的场景下...
在日常开发工作中,正则表达式是一种非常实用的工具,它可以帮助我们高效地完成字符串匹配、搜索、替换等操作。本文将对常用的正则表达式进行总结整理,并针对每一种表达式提供详细的解释与应用场景。 #### 一、...
在Java编程中,字符串的全角半角转换是一项常见的需求,尤其在处理用户输入或文本显示时。全角字符和半角字符的区别在于他们的宽度和编码方式。全角字符(全宽度字符)通常用于东亚语言,如中文、日文、韩文等,每个...
在这个例子中,我们使用`PATINDEX`函数来查找字符串中所有的半角或全角字符,并通过`REPLACE`函数和`NCHAR`函数来实现字符的转换。 #### 总结 通过对半角与全角字符及其转换方法的介绍,我们可以了解到这两种字符...
正则表达式是一种强大的文本匹配工具,广泛应用于各种编程语言及工具中,用于字符串搜索、替换等操作。本文将根据提供的内容详细解析各种正则表达式的用法及其应用场景。 #### 数字相关的正则表达式 1. **纯数字:...
字符串可以用单引号、双引号或者三引号来表示。例如: ```python s = 'Hello, world!' ``` 或者 ```python s = "Hello, world!" ``` #### 大小写处理 - **capitalize()**: 首字母大写,其余小写。 - 示例: `'...
在Python编程语言中,字符串(String)是一种非常重要的数据类型,用于存储和处理文本信息。在处理字符串时,有时我们需要判断字符串中的字符是否为数字。Python提供了三个相关的函数:`isdigit()`、`isdecimal()`和`...
### PB中全角与半角互转函数 #### 背景介绍 在处理文本数据时,经常会遇到全角字符和半角字符的转换需求。全角和半角字符主要区别在于显示宽度不同:全角字符占用两个半角字符的空间。这种特性在东亚语言(如中文、...
解决PB无法直接识别全角空格问题,特写该函数,将字符串中的全角空格替换为半角空格。
- **参数说明**:该方法接受一个字符串参数`input`,表示待转换的全角字符组成的字符串。 - **字符数组转换**:首先使用`ToCharArray()`方法将输入字符串转换为字符数组,便于逐个字符进行处理。 - **循环遍历**:...