关于 Hibernate3 与 Mysql5.5 连接时出现的中文乱码问题

本文详细介绍了在使用Hibernate连接MySQL过程中遇到的中文乱码问题,并深入分析其原因。指出即使正确配置了编码,若数据库及表的默认字符集未同步调整,则仍会出现乱码现象。文章还提供了具体的解决方案,包括如何检查和设置数据库及表的字符集。
摘要由CSDN通过智能技术生成

1. 问题描述

    今天在学习了解Hibernate时,尝试着和Mysql连接保存数据,结果总是出现中文乱码问题。这问题让我鼓捣了一下午也没整明白,按照网上教程各种配置(一般只用两步就可以配置好),仍是不见效果。直到晚上吃完晚饭继续弄的时候,再一细想才终于弄明白为什么配置好了后仍然乱码。

    我先说一下问题的原因:一般按照网上教程配置好Hibernate和Mysql的编码后(下面会介绍如何配置),如果你仍在配置编码前就建好的数据库中进行建表、插入数据(中文数据)等操作,那无疑你的数据录入和输出仍然会是乱码。


2. 分析问题出现的原因

    为什么呢?

    因为一个数据库在被创建时有一个默认属性我们一般不会去赋值,那就是数据库的"Default Character"属性。这个"Default Character"属性会根据Mysql的默认设置赋值。而且,一旦这个属性被赋值后,在这个数据库中新建的表也会继承这个默认的编码属性(除非你在新建表时指定编码字符集)。所以当你配置完Mysql和Hibernate的编码集后,如果你继续在这个数据库中建表,然后插入中文字符,Mysql会按之前默认的字符集录入、输出这些中文字符,结果就是要么出现

Incorrect string value: '\xE6\x88\x91\xE6\x98\xAF...' for column 'title1'...

一类的错误,要么就是中文字符直接以乱码的方式被录入(显示的时候当然是一堆??了).


3. 验证是否确为此类问题

    如果你也遇到了这样的问题,你可以进入Mysql控制台,分别查看在创建数据库A和表B的时候,它们的默认字符集是什么。当然如果你的数据库和表内并没有重要的数据,你完全可以drop掉整个数据库重新创建,因为只要你配置好了Mysql的字符集<一般设为utf8>,重新创建数据库和表后就不会出现中文字符乱码的问题了。

>查看创建mysql数据库时的默认字符集:

mysql> show create database mysql ;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| mysql    | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)

>查看创建mysql数据库中的general_log这张表时的默认字符集:

mysql> show create table general_log;
+-------------+--------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
| Table       | Create Table

+-------------+--------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
| general_log | CREATE TABLE `general_log` (
  `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_host` mediumtext NOT NULL,
  `thread_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `command_type` varchar(64) NOT NULL,
  `argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log' |
+-------------+--------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
以上两个实体,都有一个字符集或编码的属性,对数据库来说是:DEFAULT CHARACTER SET,对表来说是:DEFAULT CHARSET


4. Hibernate3和Mysql5.5该如何配置字符的编码?

  4.1 for Hibernate

以下有两种方式可以告诉Hibernate,在和Mysql通信时以UTF-8为默认编码:
方式1.在hibernate.cfg.xml中添加属性(在较新版本的Hibernate中推荐这种配置):
<!-- Supported UTF-8 character set -->
<property name="connection.useUnicode">true</property> 
<property name="connection.characterEncoding">UTF-8</property>
方式2.在hibernate.cfg.xml中的 "connection.url" 属性中,添加后缀(一说其中的"&"符需要转义,换成"&amp;" )第二种方法适用于较老版本的hibernate,在新版中这种配置没有第1种便于编辑改动,所以还是推荐第1种方式:
<property name="connection.url">	
    jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
</property>

  4.2 for Mysql

1. 修改my.ini文件
 [mysql] default-character-set=utf8 
说明:修改链接字符集和校对规则,它会同时设置character_set_client, character_set_connection, character_set_results;
2. 修改
 [mysqld] default-character-set=utf8 
说明: 这里修改的是服务器的字符集和校对规则。 
查看当前服务器的字符集和校对规则: 
mysql> show variables like 'character_set_server'; 
mysql> show variables like 'collation_server';


5. 最后想说

配置好以后,最好drop掉原来的数据库,再新建一个,这下应该不会再出现中文乱码问题了. Good luck ! :-)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值