`
yangzy666
  • 浏览: 20011 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
社区版块
存档分类
最新评论

字符串编码问题导致SQL异常

阅读更多
最近在做图书馆管理系统时,测试导入许多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_顽皮字符串的大列表是一个字符串列表,当用作用户输入数据时,这些字符串很有可能导致问题.zip

    "Python_顽皮字符串的大列表" 提供了一个集合,其中包含了可能导致各种问题的特殊字符串,这些字符串在作为用户输入时可能会引起意料之外的程序行为。这个列表的主要目的是帮助开发者在编写代码时考虑到这些潜在的...

    使用ASCⅡ字符串匹配技术检测防御SQL注入攻击.pdf

    该攻击手段可以导致用户数据泄露、系统瘫痪以及其他安全问题,因此,防御SQL注入攻击是Web应用安全的重要组成部分。 文章《使用ASCII字符串匹配技术检测防御SQL注入攻击》提出了一种新的防御方法。首先,该方法通过...

    SQL注入字符转换器sqlencode

    这在处理用户输入数据时非常有用,因为用户可能会有意或无意地输入可能导致SQL注入的特殊字符。 预防SQL注入的最佳实践包括: 1. 使用参数化查询或预编译语句:这是防止SQL注入最有效的方法,因为它确保了用户输入...

    Oracle中如何用SQL检测字段是否包括中文字符.doc

    例如,如果原始字符串中包含无法在目标字符集中准确表示的字符,转换可能会导致乱码或者错误。因此,在实际应用中,要确保对可能的异常情况进行充分的测试和处理。 此外,尽管这种方法在大数据量下效率相对较高,但...

    ASP技术常遇问题解答-如何避免SQL语句中含有单引号而导致操作失败?.zip

    当SQL语句中出现单引号时,数据库会将其视为字符串的边界,这可能导致语句语法错误或者意外地截断字符串。例如,如果你尝试插入包含单引号的数据,如名字为"John's",不恰当的处理会导致SQL解析错误。 2. **转义...

    SQLInner防止SQL注入式攻击源码

    7. **白名单或黑名单过滤**:SQLInner可能有内置的规则,只允许特定的字符或字符串,或者阻止已知的注入攻击模式。 8. **日志和异常处理**:通过记录和分析异常情况,SQLInner可以帮助识别潜在的攻击尝试,并采取...

    字符串加密源码2012918

    在IT行业中,数据安全是至关重要的,特别是在存储敏感信息如数据库连接字符串时。"字符串加密源码2012918" 提供了一个用于加密和解密数据库连接字符串的解决方案,这在防止未授权访问和保护数据隐私方面具有重要意义...

    应用Microsoft SQL Server 7.0要注意全角(中文)逗号的使用.pdf

    例如,如果你有一个字段用于存储包含中文字符的字符串,而该字符串中包含了全角逗号,那么在使用逗号作为分隔符进行字符串处理(如Split函数)时,可能会导致分割错误,因为SQL Server会将全角逗号视为一个单独的...

    sql快速转换成java、C代码

    2. **StringBuffer或StringBuilder的使用**:在Java中,通常使用StringBuffer或StringBuilder来拼接字符串,以避免大量的字符串连接操作导致性能下降。转换工具会根据SQL语句的结构,生成相应的append方法调用。 3....

    sql注入漏洞学习

    - **字符型注入**:在字符串字段中插入SQL代码,例如通过闭合引号和注释符来改变`LIKE`操作后的部分,如`%’order by id /*`。 3. **攻击后果** SQL注入可能导致以下后果: - **数据泄露**:攻击者可以获取...

    JEECGBOOT代码SQL漏洞处理方案.zip

    通常,这包括审查源代码,找出可能导致SQL注入的地方,比如字符串拼接SQL查询、不安全的数据库库函数使用(如`EXECUTE IMMEDIATE`)或者没有使用预编译的参数化查询(PreparedStatement)。一旦定位到问题代码,应...

    SQL编码规范.doc

    - 在C#中构建SQL字符串时,应避免直接拼接,因为这可能导致SQL注入问题。建议使用参数化查询或者`StringBuilder`来组合SQL语句,如`SqlCommand`对象的`Parameters`集合。 6. **性能优化**: - 避免在`WHERE`子句...

    SQL-injection-detective.rar_Detective_sql injection_sql 注入_sql注入

    2. C#与SQL安全:C#中的ADO.NET库提供了与SQL Server交互的接口,但如果不正确地使用,可能导致SQL注入。使用参数化查询或存储过程可以有效地防止注入攻击,因为它们将用户输入的数据与查询结构分离开来。 3. SQL...

    jdbc连接oracle字符集不同出现乱码

    这是因为 Java 在处理字符串时默认按照特定的字符集进行解码,而在本例中,Java 应用期望使用 `ZHS16GBK` 解码,但实际上却按照 `US7ASCII` 编码的数据进行了解码,从而导致乱码现象的发生。 #### 解决方案 为了...

    SQL注入漏洞演示源代码

    1. **恶意输入示例**:展示攻击者如何构造输入字符串,比如在用户名或密码字段中插入SQL命令,以绕过身份验证或获取额外数据。 2. **易受攻击的代码片段**:这些代码可能没有对用户输入进行足够的验证和转义,直接将...

    SQL错误状态的提示信息

    - **01004 字符串数据右截断**:表示字符串数据在写入时发生了右截断。 - **01005 SQLDA错误**:表示SQL描述区域(SQLDA)出现错误。 - **01007 权限不足**:表示当前用户没有足够的权限执行某项操作。 - **01503 外键...

    SQL注入攻击与防御 第2版.pdf

    当开发人员在编写动态网页时,如果不正确地过滤或转义用户输入的数据,这些数据就可能被解释为SQL命令的一部分,导致SQL注入漏洞。 攻击过程: 1. 攻击者通过Web表单、URL参数等方式输入恶意SQL语句。 2. 应用程序...

    DB2异常代码查询大全

    - **SQLSTATE**:是DB2返回的一个五字符字符串,用于进一步细化SQLCODE的含义。 下面将列举一系列具体的异常代码及其含义: 1. **00000**:表示SQL操作成功完成。 2. **01xxx**:表示SQL操作成功但有警告,例如...

    一次sql注入问题的筛查报告 ,主要 是sql 注入的问题

    1. 参数化查询:使用预编译的SQL语句,将用户输入作为参数传递,而不是直接拼接在SQL字符串中。 2. 输入验证:对用户输入进行严格的校验,如长度限制、字符类型限制等。 3. 最小权限原则:数据库账户应分配最小必要...

    SQL 注入 攻击 测试方法介绍

    例如,在登录页面,如果用户名或密码字段直接拼接到SQL查询中,攻击者可以通过输入特定的字符串,比如单引号(')来尝试破坏查询的语法,进而执行非预期的SQL操作。 在进行SQL注入测试时,可以按照以下步骤进行: 1....

Global site tag (gtag.js) - Google Analytics