0 0

hibernate 乱码问题(全程都是utf-8,为什么还是乱码)25

一,数据库(mysql)

mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8                                                    |
| character_set_connection | utf8                                                    |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8                                                    |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | D:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

 

mysql> show create table user;
+-------+-------------------------------------------------------------------------------------------
----------------------------------------------------------------------+
| Table | Create Table
                                                                      |
+-------+-------------------------------------------------------------------------------------------
----------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` bigint(20) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------
----------------------------------------------------------------------+

 

二,applicationContext.xml

<!-- 配置数据源 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<!-- Connection Info -->
		<property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
		<property name="username" value="root" />
		<property name="password" value="elephant1234" />

		<!-- Connection Pooling Info -->
		<property name="initialSize" value="5" />
		<property name="maxActive" value="100" />
		<property name="maxIdle" value="30" />
		<property name="maxWait" value="1000" />
		<property name="poolPreparedStatements" value="true" />
		<property name="defaultAutoCommit" value="false" />
	</bean>

	<!-- 配置sessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="namingStrategy">
			<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">false</prop>
				<prop key="hibernate.hbm2ddl.auto">create</prop>
			</props>
		</property>
		<property name="packagesToScan" value="com.company.project.*" />
	</bean>
 

三,所有的java文件都是utf-8的

四,测试类

public class TestRun
{
	@Test
	public void testRunSpring()
	{
		try
		{
			ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
			SessionFactory sessionFactory = (SessionFactory)ac.getBean("sessionFactory");
			Session session = sessionFactory.openSession();
			session.beginTransaction();
			User user = new User();
			user.setName("杨志斌");
			session.save(user);
			session.getTransaction().commit();
		} catch (BeansException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (HibernateException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 

期待高手解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 


问题补充:
数据库显示:
+----+-----------+
| id | name      |
+----+-----------+
|  1 | 鏉ㄥ織鏂?   |
+----+-----------+

我使用mysql> set names gbk;然后显示:
mysql> select * from user;
+----+--------+
| id | name   |
+----+--------+
|  1 | 杨志斌      |
+----+--------+
1 row in set (0.00 sec)

这说明插入到数据库为gbk编码,不知道为什么是gbk编码
问题补充:
感谢1000的回答,但是我下面的查询还不能代表我的mysql为utf8表名吗?
我安装时时latin1的,但是我修改了my.ini文件,使数据库为utf8编码的了,这样效果应该一样吧
mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8                                                    |
| character_set_connection | utf8                                                    |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8                                                    |
| character_set_server     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | D:\Program Files\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)


问题补充:
感谢Rowen
我没有使用tomcat,我就单纯做hibernate+spring测试(也没有使用struts)
问题补充:
再次感谢1000, 我安装你的那个方式重新配置过还是不行,数据库里还是乱码
2009年8月11日 16:12

24个答案 按时间排序 按投票排序

0 0

这个也就是默认使用了windows平台的默认字符编码,

你用控制台查看数据库中的数据,那个dos控制台本身就是用gbk来显示的

你可以用程序再把数据从数据库中查询出来看是否乱码就知道是否正确插入

2009年8月24日 12:51
0 0

出现乱码的主要原因:
数据库中显示的编码格式和你插入的编码格式不一致


既然“ set names gbk”能正常显示中文,那说明你的数据表采用的编码格式是GBK,你虽然设置为UTF-8,但是事实证明一切,你的编码格式还是GBK

user.setName("杨志斌");   


上面这调语句到保存到数据库中,进而显示出来的编码变化如下:

字符串(Unicode编码)---->UTF-8(你设置的数据库连接编码)----->GBK(你数据库采用的编码格式)

在转化的过程中,首先在第一步转化时,一个汉字本来是两个字节,转化为UTF-8后,变为了三个字节,而在第二步转化的时候,一个汉字又变为了两个字节。这个听起来可能有点费力,举个例子吧:

例如你想保存“a中文”这个字符串
  • “a中文”对应的Unicode编码是:\u0061\u4E2D\u6587(注解:可以看到占用了六个字节)
  • “a中文”从Unicode编码变为UTF-8编码后的编码:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87(注解:UTF-8是采用字节数组来保存数据的,0x开头的是十六进制数,对于英文字符,UTF-8采用ASCII编码格式,即占用了一个字节,而对于中文占用了三个字节)
  • “a中文”从UTF-8编码变为GBK编码后的编码是:\u0061\u6D93\uE15F\u6783(注解:此时转化时根据UTF-8的编码进行的,所以会依次读取字节数组,每两个字节转换为一个字符,所以就转换了四个字符最后一个是?),你如果用nativeascii转化一个泥就能看到结果是:a涓枃?。


通过我以上的分析,你应该明白出现乱码的原因了吧。


解决办法:
我个人认为,作为一个Java程序员,只要明白原理之后,应该具备解决问题的能力的。
首先问一下自己,在设置每一处字符编码的时候,作用是什么?不要在不理解的情况下,到处设置,结果当然会出现乱码了。把你所有的设置过的编码全部去掉,然后只要设置两处即可。

2009年8月18日 11:47
0 0

添加一个过滤器吧,肯定没问题的。

2009年8月18日 11:20
0 0

关注下!

2009年8月17日 14:20
0 0

设置了UTF8应该没问题了,看看你的IDE的字符设置了没!?!?

2009年8月17日 14:08
0 0

不好意思,没把你的问题看完。。。
那么你这样试试吧。。第一 在命令行插入汉字。。select 看是否为乱码!
其次。。页面的数据先不提交到数据库。。在后台把它打印出来。。。看是否为乱码!
如果这样还是找不到原因。。建议拿到别的电脑上面试试。。。
是否为mysal安装的问题! 以前我也这样遇到过。。

2009年8月17日 14:06
0 0

你页面用的utf8 数据库用的 gbk 不乱码 才怪呢! 建议都用utf8 ! 以前也被乱码的问题烦透了。。

2009年8月17日 14:01
0 0

建议页面和数据库的字符集都设成gbk,这样可以避免不必要的错误,如果这样还是不行的话,在mysql命令行里输入set names gbk这个口令,一般情况下是可以解决乱码问题的,如果还是不行的话那你只有再另查别的资料了

2009年8月14日 13:38
0 0

绝对数据库字符编码的问题,看看这个吧http://txyly998.iteye.com/blog/338166

2009年8月14日 11:08
0 0

在MYSQL的安装文件中my.ini文件中一定出现的是default-character-set=gbk有两处,这是mysql默认的编码格式,你把gbk改为utf8,看看就可以了。我想问题就出现在这。

2009年8月13日 21:47
0 0

你这个问题是数据库编码问题,表的设计中如果有中文字段,应该在表的设计时候给对应的字段设置编码,默认的lais啥子哟。记不到了。改为GB2312 你在试试。不行找我

2009年8月13日 12:01
0 0

有可能是你的dos窗口没有设置编码

运行 > cmd > 右键(属性) > 字体换成(宋体) >

试试!!

2009年8月13日 10:38
0 0

首先:从你的show variables like '%char%';可以看出你已经成功设置好了数据库引擎的编码;

其次:你在建表的时候应该采用此种格式:
CREATE TABLE FUNDTYPE
(
FUND_TYPE_CODE VARCHAR(32) UNIQUE NOT NULL,
FUND_TYPE_NAME VARCHAR(32) NOT NULL,
CONSTRAINT PK_FUNDTYPE PRIMARY KEY(FUND_TYPE_CODE)
)ENGINE=INNODB DEFAULT CHARSET=UTF8;
即在后面加入"ENGINE=INNODB DEFAULT CHARSET=UTF8"

最后:
hiberntae的链接属性应该为<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/database_name?useUnicode=true&amp;characterEncoding=utf-8"/>

我的个人步骤是如此,你不防试试。

2009年8月12日 18:16
0 0

mysql里设置字段字符集

2009年8月12日 17:07
0 0

mysql数据库默认编码改为gbk

2009年8月12日 14:59
0 0

插入表格: 用换行和
来编辑格子
|

2009年8月11日 17:30
0 0

引用
ENGINE=InnoDB DEFAULT CHARSET=utf8

我的表添加UTF 8支持的时候是这样。。
Create table tablename(
id int(10) unsigned NOT NULL AUTO_INCREMENT,
name varchar(15) NOT NULL default '',
PRIMARY KEY   (id)
) TYPE=MyISAM DEFAULT CHARACTER SET UTF8

驱动:
引用
useUnicode=true&amp;characterEncoding=UTF-8"

useUnicode=true&characterEncoding=utf-8"

2009年8月11日 17:14
0 0

要不就换个MySQL版本试吧。这样看配置什么的都基本没什么问题。

2009年8月11日 16:53
0 0

那就怪了,你的配置和我的差不多。就剩下org.hibernate.dialect.MySQL5InnoDBDialect方言不一样了。
我以前也遇到过此问题,解决了很多次。

2009年8月11日 16:51
0 0

我以前也和你是一样的。修改配置文件。不过也没起作用。不妨按照我说的试一下

2009年8月11日 16:38
0 0

你是不是TOMCAT。。是的话。。改下编码试试:
修改Tomcat\conf下的server.xml
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150"
connectionTimeout="20000" redirectPort="8443"
URIEncoding="UTF-8"/>
修改目的:为了解决使用HTTP Get方法传递中文参数乱码的问题

2009年8月11日 16:25
0 0

如果你的MySQL是安装版的话,有一个步骤是在安装的时候让你选择编码方式。
必须在那里指定是utf-8插入数据库后才是正确的。
你重新安装下数据库,里面有一个步骤见图

2009年8月11日 16:23
0 0

检查数据库编码方式

2009年8月11日 16:17
0 0

是插入到数据库里乱码对吗?

2009年8月11日 16:15

相关推荐

Global site tag (gtag.js) - Google Analytics