最近在做图书馆管理系统时,测试导入许多MARC文件(可把它看成文本文件),没有问题,唯独有一个文件在导入过程中总是报错:
java.sql.BatchUpdateException: 批次处理0insert into...
org.hibernate.exception.DataException: Could not execute JDBC batch update
ERROR: invalid byte sequence for encoding "UTF8": 0x00
这是我所能看到的主要的异常信息。
很显然这是一个批次更新异常,但具体是怎么引起的呢,我不知道,网上说肯定是SQL有问题,但我操作的是EJB3.0的持久化包,SQL都是自动生成的,况且导入了那么多记录都成功了,为什么只在这里就有SQL异常呢?郁闷了好几天。后来又看到上面第三条信息:"UTF8"编码的无效的字节序列,是什么意思,难道是插入的某个字段编码有问题?但肯定是在入库时DB采用了UTF8编码。0x00是16进制的数据,相当于十进制的0,对应的byte类型的值也是0.结果也证明了确实是有个字段在插入数据库之前的编码转换出现了问题。准确地说,就是字符串中byte=0的那个字节有问题。于是当我把这个字符串打散成字节数组时,通过如下代码进行了矫正:
byte[] b = marcContent.getBytes();
for (int i = 0; i < b.length; i++) {
if (b[i] == 0)
b[i] = 32;// 如果字节数值为0,则替换为32(ASCII码,表示空格),否则可能会出现入库时的编码错误
}
其中marcContent就是插入DB时编码有问题的字符串,最后重新构造这个字符串:
marcContent = new String(b);
重新导入这个MARC文件,一切正常!
至于为什么这条记录中为0的字节会导致入库时的SQL问题,我也不得其解,但是我也发现其他记录中同样为0的字节就不会出现这样的问题。
(第一次写出自己的问题,可能说得不太清楚,请见谅)
分享到:
相关推荐
"Python_顽皮字符串的大列表" 提供了一个集合,其中包含了可能导致各种问题的特殊字符串,这些字符串在作为用户输入时可能会引起意料之外的程序行为。这个列表的主要目的是帮助开发者在编写代码时考虑到这些潜在的...
该攻击手段可以导致用户数据泄露、系统瘫痪以及其他安全问题,因此,防御SQL注入攻击是Web应用安全的重要组成部分。 文章《使用ASCII字符串匹配技术检测防御SQL注入攻击》提出了一种新的防御方法。首先,该方法通过...
这在处理用户输入数据时非常有用,因为用户可能会有意或无意地输入可能导致SQL注入的特殊字符。 预防SQL注入的最佳实践包括: 1. 使用参数化查询或预编译语句:这是防止SQL注入最有效的方法,因为它确保了用户输入...
例如,如果原始字符串中包含无法在目标字符集中准确表示的字符,转换可能会导致乱码或者错误。因此,在实际应用中,要确保对可能的异常情况进行充分的测试和处理。 此外,尽管这种方法在大数据量下效率相对较高,但...
当SQL语句中出现单引号时,数据库会将其视为字符串的边界,这可能导致语句语法错误或者意外地截断字符串。例如,如果你尝试插入包含单引号的数据,如名字为"John's",不恰当的处理会导致SQL解析错误。 2. **转义...
7. **白名单或黑名单过滤**:SQLInner可能有内置的规则,只允许特定的字符或字符串,或者阻止已知的注入攻击模式。 8. **日志和异常处理**:通过记录和分析异常情况,SQLInner可以帮助识别潜在的攻击尝试,并采取...
在IT行业中,数据安全是至关重要的,特别是在存储敏感信息如数据库连接字符串时。"字符串加密源码2012918" 提供了一个用于加密和解密数据库连接字符串的解决方案,这在防止未授权访问和保护数据隐私方面具有重要意义...
例如,如果你有一个字段用于存储包含中文字符的字符串,而该字符串中包含了全角逗号,那么在使用逗号作为分隔符进行字符串处理(如Split函数)时,可能会导致分割错误,因为SQL Server会将全角逗号视为一个单独的...
2. **StringBuffer或StringBuilder的使用**:在Java中,通常使用StringBuffer或StringBuilder来拼接字符串,以避免大量的字符串连接操作导致性能下降。转换工具会根据SQL语句的结构,生成相应的append方法调用。 3....
- **字符型注入**:在字符串字段中插入SQL代码,例如通过闭合引号和注释符来改变`LIKE`操作后的部分,如`%’order by id /*`。 3. **攻击后果** SQL注入可能导致以下后果: - **数据泄露**:攻击者可以获取...
通常,这包括审查源代码,找出可能导致SQL注入的地方,比如字符串拼接SQL查询、不安全的数据库库函数使用(如`EXECUTE IMMEDIATE`)或者没有使用预编译的参数化查询(PreparedStatement)。一旦定位到问题代码,应...
- 在C#中构建SQL字符串时,应避免直接拼接,因为这可能导致SQL注入问题。建议使用参数化查询或者`StringBuilder`来组合SQL语句,如`SqlCommand`对象的`Parameters`集合。 6. **性能优化**: - 避免在`WHERE`子句...
2. C#与SQL安全:C#中的ADO.NET库提供了与SQL Server交互的接口,但如果不正确地使用,可能导致SQL注入。使用参数化查询或存储过程可以有效地防止注入攻击,因为它们将用户输入的数据与查询结构分离开来。 3. SQL...
这是因为 Java 在处理字符串时默认按照特定的字符集进行解码,而在本例中,Java 应用期望使用 `ZHS16GBK` 解码,但实际上却按照 `US7ASCII` 编码的数据进行了解码,从而导致乱码现象的发生。 #### 解决方案 为了...
1. **恶意输入示例**:展示攻击者如何构造输入字符串,比如在用户名或密码字段中插入SQL命令,以绕过身份验证或获取额外数据。 2. **易受攻击的代码片段**:这些代码可能没有对用户输入进行足够的验证和转义,直接将...
- **01004 字符串数据右截断**:表示字符串数据在写入时发生了右截断。 - **01005 SQLDA错误**:表示SQL描述区域(SQLDA)出现错误。 - **01007 权限不足**:表示当前用户没有足够的权限执行某项操作。 - **01503 外键...
当开发人员在编写动态网页时,如果不正确地过滤或转义用户输入的数据,这些数据就可能被解释为SQL命令的一部分,导致SQL注入漏洞。 攻击过程: 1. 攻击者通过Web表单、URL参数等方式输入恶意SQL语句。 2. 应用程序...
- **SQLSTATE**:是DB2返回的一个五字符字符串,用于进一步细化SQLCODE的含义。 下面将列举一系列具体的异常代码及其含义: 1. **00000**:表示SQL操作成功完成。 2. **01xxx**:表示SQL操作成功但有警告,例如...
1. 参数化查询:使用预编译的SQL语句,将用户输入作为参数传递,而不是直接拼接在SQL字符串中。 2. 输入验证:对用户输入进行严格的校验,如长度限制、字符类型限制等。 3. 最小权限原则:数据库账户应分配最小必要...
例如,在登录页面,如果用户名或密码字段直接拼接到SQL查询中,攻击者可以通过输入特定的字符串,比如单引号(')来尝试破坏查询的语法,进而执行非预期的SQL操作。 在进行SQL注入测试时,可以按照以下步骤进行: 1....