读书人

java从MySQL中读取blob类型中文乱码有

发布时间: 2012-07-28 12:25:13 作者: rapoo

java从MySQL中读取blob类型中文乱码问题,答的好加分
java通过JDBC读取BLOB类型的数据(是一些中文字符)但是读取时不能完全显示所有中文,中文中不能显示都是?号
我用的哦mysql是版本 5.0.27 字符集设置是GBK 但是存储参数查看时我看了是UTF-8的字符集,直接从MYSQL中读取数据时为html格式是中文 能够完全显示:
这是数据库直接导出的结果:
<p><font face="Arial">       这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告</font></font></font></font></font></p> <p><font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告</font></font></font></font></p> <p><font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告</font></font></font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告</font></font></p> <p><font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告</font></font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告</font></font></font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告</font></p> <p><font face="Arial">这是一个很长很长的公告<font face="Arial">这是一个很长很长的公告</font></font></p>

但是用JDBC从数据库里读出的是:

<p><font face="Arial">       这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??/font></font></font></font></font></p>
<p><font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??/font></font></font></font></p>
<p><font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??/font></font></font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??/font></font></p>
<p><font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??/font></font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>


<p><font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??/font></font></font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??/font></p>
<p><font face="Arial">这是????很长很长的公??font face="Arial">这是????很长很长的公??/font></font></p>

我用的数据库驱动是:mysql-connector-java-5.0.6-bin.jar
在读取我把数据进行转化:
String sBlob = "";
InputStream in = this.rs.getBinaryStream(colName);
byte[] buffer = new byte[1024];
int len = 0;
while ( (len = in.read(buffer)) != -1)
{
sBlob += new String(buffer, 0, len);
}
in.close();
System.out.println("SQL****:"+new String(sBlob.getBytes("GBK"),"UTF-8"));
return new String(sBlob.trim().getBytes("GBK"),"UTF-8");

如果不转化基本是乱码

[解决办法]
命令行下登入mysql 输入\s

注意到有如下内容:
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1

MySQL数据库默认的字符集是latin1,是瑞典的文字字符集,难怪有中文乱码的问题

解决方式

步骤1:
在my.ini中[mysql]后追加内容

default-character-set= gbk

完成后 中文乱码的问题依然存在
命令行下登入mysql 输入\s再看一下

注意到如下内容

Server characterset: latin1
Db characterset: latin1
Client characterset: gbk
Conn characterset: gbk

发现

Client characterset、Conn. Characterset已经由latin1改变为gbk

但是Server characterset、Db characterset依然是latin1

这个显然就是乱码产生的原因

继续

步骤2:

在my.ini中[mysqld]后追加内容

default-character-set= gbk

命令行下登入mysql 输入\s再看一下
注意到

Server characterset: gbk
Db characterset: gbk
Client characterset: gbk
Conn characterset: gbk

全部都为gbk编码了

但还是会出现乱码,这就是我们在建立表的时候,它默认的字符也可能是latin1,如果是latin1的话,
或者不是gbk的话,都有可能是出现字符乱码的,所以,在我们建立好一个表之后,我们应该要进行转换一下表的字符。
命令为

Alter TABLE [表名] CONVERT TO CHARACTER SET GBK;
这样子就不会出现乱码这个问题了。
[解决办法]
你现在先看一下,这样子可不可以帮你解决这个问题。

还有,你为什么不用mediumtext这个类型而用BLOB类型

blob类型是用于存储文件,以二进制方法存储。

读书人网 >J2EE开发

热点推荐