`

数据库编程之编码转换实例--乱码分析

阅读更多

1问题描述

最近有人问我问题,说在Java中以UTF-8编码读UTF-8编码的文件test.htm,存入oracle数据库后再读出,一切正常。在JavaUTF-8编码读UTF-8编码的文件test.htm,存入kingbase数据库后再读出,文件中出现乱码,不知为何。

2具体现象

具体现象如下:

Java中读UTF-8编码的文件test.htm,存入数据库后再读出,文件中出现乱码

 

原文件图如下:



 

3 存入数据库再读出后出现乱码如下:



 

注:前面两幅图中“合资公司双方出资比例的问题”前面的那个“”变成了“ ”。

 

 

4 相关代码 

下面是模拟这个过程的读写文件和写读数据库的java代码:

 

import java.io.ByteArrayOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.sql.Clob;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

 

public class TestEoding {

    public static void main(String[] args) throws Exception {

    //create table and insert 1 recode

    //oraclekingbase

    // create table t_test (id int,txt clob);

        // insert into t_test (id,txt) values(1,'');

    //pg

    // create table t_test (id int,txt text);

        // insert into t_test (id,txt) values(1,'');

 

    //kingbase

    String driver = "com.kingbase.Driver";

        String url = "jdbc:kingbase://127.0.0.1:54321/BEIGANG?ClientEncoding=UNICODE";

        String usr = "BEIGANG";

        String passwd = "beigang";

        String fn = "E:/test.htm";

        /*

//pg

    String driver = "org.postgresql.Driver";

        String url = "jdbc:postgresql://127.0.0.1:5432/beigang";

        String usr = "beigang";

        String passwd = "beigang";

        String fn = "E:/test.htm";

*/

        if (args.length > 0) {

            fn = args[0];

        }

 

        String value = getValue(fn);

        testDB(driver, url, usr, passwd, fn + ".kb", value);

/*

       //sqlserver

        driver = "net.sourceforge.jtds.jdbc.Driver";

        url = "jdbc:jtds:sqlserver://127.0.0.1:1433/beigang";

        usr = "beigang";

        passwd = "beigang";

        testDB2(driver, url, usr, passwd, fn + ".mssql", value);

 

        driver = "oracle.jdbc.driver.OracleDriver";

        url = "jdbc:oracle:thin:@127.0.0.1:1521:beigang";

        usr = "beigang";

        passwd = "beigang";

        testDB2(driver, url, usr, passwd, fn + ".oracle", value);

*/

    }

 

    protected static void testDB(String driver, String url, String usr,

            String passwd, String fn, String value) throws SQLException,

            Exception {

   

    Class.forName(driver);

        Connection conn = DriverManager.getConnection(url, usr, passwd);

        String sql = "update t_test set txt = ? where id=1";

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setString(1, value);

        stmt.executeUpdate();

        stmt.close();

 

        sql = "select txt from t_test where id=1";

        stmt = conn.prepareStatement(sql);

        ResultSet rs = stmt.executeQuery();

        if (rs.next()) {

            writeFile(fn, rs.getString(1));

        }

      

/*

 * pg

        String sql = "update t_test set txt = '" +value +"' where id=1";

        ResultSet rs;

        stmt.executeUpdate(sql);

       

        sql = "select txt from t_test where id=1";

        rs = stmt.executeQuery(sql);

 

        if (rs.next()) {

            writeFile(fn, rs.getString(1));

        }

        */

    }

 

    protected static void testDB2(String driver, String url, String usr,

            String passwd, String fn, String value) throws SQLException,

            Exception {

        Class.forName(driver);

        Connection conn = DriverManager.getConnection(url, usr, passwd);

        String sql = "update t_test set txt = ? where id=1";

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setString(1, value);

        stmt.executeUpdate();

        stmt.close();

 

        sql = "select txt from t_test where id=1";

        stmt = conn.prepareStatement(sql);

        ResultSet rs = stmt.executeQuery();

        if (rs.next()) {

            writeFile(fn, rs.getString(1));

        }

    }

 

    private static void writeFile(String fn, String string) throws Exception {

        FileOutputStream fos = new FileOutputStream(fn);

        byte[] content = string.getBytes("UTF-8");

        fos.write(content);

        fos.flush();

        fos.close();

    }

 

    private static String getValue(String fn) throws Exception {

        ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);

        FileInputStream fins = new FileInputStream(fn);

        int b = -1;

        while ((b = fins.read()) != -1) {

            baos.write(b);

        }

        return baos.toString("UTF-8");

        //return baos.toString("GBK");

    }

}

 

4 结论

结果测试确认,发现oraclekingbase等数据库中存在同样问题,问题原因是编码"UTF8"的字符0xe383bb(就是“”)在"GBK"没有相对应物。刚开始说的oracle不出现乱码,而kingbase出现乱码是他搞错了数据库服务器端编码,oracle用来UTF-8的编码,kingbase用了GBK的编码导致。

根本原因是"UTF8"编码的字符0xe383bb(就是" ")在"GBK"没有相对应物。

 

5 数据库字符集和编码转换

参见我的博客http://beigang.iteye.com/admin/blogs/1254738

 

6

test.htm传上来,压缩文件使test.rar,有兴趣可以实践下

 

 

 

 

 

 

 

 

 

  • 大小: 16.9 KB
  • 大小: 17.2 KB
  • 大小: 253 Bytes
0
3
分享到:
评论

相关推荐

    java编程中乱码问题解决

    此外,还应养成良好的编码习惯,如使用标准的字符集编码(如`UTF-8`),以及在处理特定数据时进行适当的编码转换。通过这些措施,可以大大降低乱码问题的发生概率,提高软件系统的稳定性和用户体验。

    C++Mysql8.0数据库跨平台编程实战.zip

    通过学习如何正确设置字符集和处理编码转换,可以确保数据的正确显示和存储。 最后,通过提供的各章节代码,你可以在实践中加深对每个主题的理解。从第二章到第七章,涵盖了从基础到进阶的各个部分,每章的代码示例...

    彻底解决中文乱码的问题

    6. 字符串处理:在处理字符串时,需要谨慎对待字符串的编码转换,如`new String(bytes, "GBK")`,确保正确的编码被使用。 7. 源码文件编码:确保所有源代码文件使用同一编码,推荐使用UTF-8,这样能避免因源码编码...

    SupplyunittableUtil.java(中文乱码解决之道)

    在`SupplyunittableUtil.java`类中,可能有静态方法处理这些情况,比如读取或写入文件时的预处理和后处理工作,或者数据库查询时的编码转换函数。此外,它可能还提供了处理特定场景下乱码问题的通用方法,以便在整个...

    c#解决mysql乱码问题的解决及mysql数据库操作的封装

    在C#编程中,与MySQL数据库交互时可能...总之,解决MySQL乱码问题的关键在于统一字符集设置和正确处理编码转换,而封装数据库操作则可以提高代码的复用性和模块化程度。希望这篇文章能帮助你更好地理解和处理这些问题。

    编码转换器(编码互转)

    6. **应用实例**: 在电子邮件、文本编辑器、数据库导入导出、网页开发等领域,编码转换都是必不可少的。例如,当从一个使用UTF-8编码的数据库导出数据到一个使用GBK编码的系统时,就需要使用编码转换器进行转换。 7...

    Java编程乱码处理方法大全(附图说明)

    总之,Java编程中的乱码问题需要开发者对字符编码有深入的理解,并且在各个层次——从文件读写到网络传输,从数据库到Web容器——都做好编码的适配和转换工作。只有这样,才能有效地避免和解决乱码问题,保证程序的...

    文件字符编码转换

    7. **应用实例**:在开发跨平台软件或网站时,确保文件和数据库的编码一致性至关重要,避免因编码不匹配引发的显示问题。此外,对于处理旧版文档或从不同地区获取的数据时,编码转换工具也是必不可少的。 总的来说...

    易语言源码编码转换大全.7z

    压缩包内的“编码转换大全”可能包含了各种编码转换的实例代码,包括不同编码间的转换方法、异常处理机制以及实际应用中的注意事项。学习这些源码可以帮助开发者深入理解字符编码的本质,提高处理编码问题的能力,...

    java_各种编码转换源代码

    在Java编程语言中,编码转换是一项重要的任务,特别是在处理不同来源的数据时,如读取文本文件、网络数据传输或数据库交互。本资源包含一个名为`CodeConvert.java`的源代码文件,它提供了对多种编码格式进行转换的...

    解决java所有中文乱码集合

    1. 文件编码转换:使用Notepad++等工具将源代码文件转换为统一的编码格式,如UTF-8。 2. 程序编码处理:在读写文件时,通过new InputStreamReader(fileInputStream, "UTF-8")和new OutputStreamWriter...

    字符乱码解法方案

    4. **使用转换工具**:对于已存在的乱码文件,可以利用编码转换工具(如Notepad++等文本编辑器)将其转换成正确的编码格式。 5. **代码层面的检查与调整**: - 在输入输出时指定正确的编码方式。 - 对于数据库...

    中文字符级转换实例下载

    在Java编程语言中,中文字符级转换是一个关键的议题,特别是在处理中文文本和字符串时。这个主题涉及到如何正确地编码、解码以及操作中文字符,确保数据在不同环境下的兼容性和准确性。以下是一些关于“中文字符级...

    JAVA 转换字符编码工具

    在Java编程语言中,字符编码是一个非常重要的概念,特别是在处理文本数据时。字符编码决定了如何将字符转换为字节序列,以及如何从字节序列恢复字符。本篇将围绕"JAVA 转换字符编码工具"这个主题,深入探讨字符编码...

    Delphi 读取DAT格式的数据库.rar

    开发者需要确保代码中的字符串资源和 UI 控件都使用了正确的字符集,并且在处理文本输入和输出时考虑到编码转换。 "Delphi源码-数据库实例" 这个标签进一步强调了这是一个实际的代码示例,适用于学习如何在 Delphi ...

    易语言程序免安装版下载

    取错误文本()”返回的文本是UTF-8编码(应是GB18030编码)。 -------------------------------------------------------------------------------- 易语言5.0 相对于易语言4.x更新说明(2010/02/01):  增加...

    JSP kindeditor编辑器使用,能上传图片,解决乱码问题

    当你参考示例代码时,特别是涉及到字符串转换和输出时,要特别关注编码问题。例如,在Servlet中读取上传文件名或处理其他用户输入时,确保正确地进行编码和解码。 6. **调试和测试** 在实际开发中,对每个步骤...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例031 Zend Studio编码格式的转换 56 实例032 Zend Studio中快捷键的运用 57 实例033 Zend Studio中部署Apache服务器 60 第2章 PHP基础 63 2.1 基本语法 64 实例034 在页面中打印PHP的配置信息 64 实例035 在页面...

Global site tag (gtag.js) - Google Analytics