我在新增页面的时候,如是对象的某个属性为中文,就会抛下面那个异常,导致新增不成功
net.sf.hibernate.JDBCException: Could not execute JDBC batch update
at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:129)
at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2417)
at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2367)
at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2236)
at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61)
Caused by: java.sql.BatchUpdateException: General error message from server: "Incorrect string value: '\xD6\xD0\xB9\xFA' for column 'url_name' at row 1"
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1492)
at net.sf.hibernate.impl.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:54)
at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:122)
... 31 more
如果程序中不输入中文就能新增成功;
如查数据库中某个表的某一属性是中文,然后显示在页面是????;
我在hibernate.cfg.xml里面配了jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GB2312
我的问题是,怎么去解决这个中文乱码问题,上网查了一会儿,试了几种方案都不行。所以来这问问了,请大家帮忙,谢谢!!
[b]问题补充:[/b]
哥们,按你这样做不行呀
[b]问题补充:[/b]
我们那个项目是以前开发的,现在只是往里面加一些功能,但是以前开发的时候,采用的编码方式是gbk,我现在感觉问题是出在这。jsp文件,java文件,都是用的gbk,但是现在也没有办法去改呀,要转的话会出好多编码方面的错的,请教各位在这种情况下怎么去解决乱码问题
[b]问题补充:[/b]
大家帮我想,有什么好办法去解决
[b]问题补充:[/b]
jh_soft哥们的意思是把页面传过来的每一个属性都要转一遍格式吗
三种方案:
方案一:检查数据是用字符类型,在数据插插入之前转成这种格式。但是你显示到页面,你可能又得与数据格式转成GBK或UTF-8等。
方案二:重新安装数据库,在选择字符集时,选择UTF-8,这样就可以大功告成了。
方案三:查看Mysql文档,将字符集改UTF-8,如果可以成功的话,这样就更好啦。不过一般改不过来,还得重装。
我以前遇到类似的问题,用下面的方式解决的,希望有用.
[quote]
需要在hibernate的配置文件中添加一个属性,(这里使用了spring的IOC容器来注入)
${hibernate.query.factory_class}<!--添加这个属性就可以了-->
........................
org.hibernate.hql.classic.ClassicQueryTranslatorFactory
原因时hibernate在把hql转换成sql语句的时候,出现了乱码(如果有中文的话),按以上的配置的话,就没有什么问题了。还有一个方法就是,使用预编译的hql,然后动态绑定参数。不过这个方法是针对这一个函数本省而言的,如果你是使用Hibernate3而很多查询涉及中文的话,最好使用配置文件的方式,简单。
出处:http://www.zhinangtuan.net.cn/show/20074/20074161815715860.html
[/quote]
[quote]
众所周知,com.mysql.jdbc.Connection的构造函数public java.sql.Connection connect(String url, Properties info)会在构造的时候接受一个Properties型的参数,其中的“useUnicode”和“characterEncoding”决定了它是否在客户端和服务器端传输过程中进行Encode,以及如何进行Encode。详细可参见private void checkServerEncoding()方法。
Hibernate使用net.sf.hibernate.cfg.Environment来存储系统级的所有属性,而用net.sf.hibernate.cfg.Settings来存储Hibernate的设定。
但是net.sf.hibernate.cfg.Environment里保存的Properties不是直接提供给com.mysql.jdbc.Connection使用的。
net.sf.hibernate.connection.ConnectionProviderFactory会在public void configure(Properties props)中使用用public static Properties getConnectionProperties(Properties properties)方法进行筛选。
带有特定前缀public static final String CONNECTION_PREFIX = "hibernate.connection"并且没有被放到private static final Set SPECIAL_PROPERTIES里的属性才会被留下来。
然后,它在public Connection getConnection()中建立连接的时候使用的是它自己筛选完之后的private Properties connectionProps属性。
所以答案就很明显了。
使用hibernate.cfg.xml的话,在和之间加入这么一段:
[code:1] true
UTF-8[/code:1]
如果是些程序的话,在创建完net.sf.hibernate.cfg.Configuration、并使用configure()读取完配置文件之后,buildSessionFactory()之前,执行如下代码:
[code:1] Properties extraProperties = new Properties();
extraProperties.put("hibernate.connection.useUnicode", "true");
extraProperties.put("hibernate.connection.characterEncoding", "UTF-8");
myConfiguration.addProperties(extraProperties);[/code:1]OK!万事大吉了!
出处:http://www.iteye.com/post/26866
[/quote]
让MYSQL支持GBK//你是GB2312就换一下也行,我以前就是看这个解决乱码的,你试试..
在mysql数据库中,使用的是latin字符集,所以无法正常的支持中文字符,中文在数据库中显示为乱码“?”号。为了让mysql可以正常使用 中文,尤其是当使用jsp连接mysql的时候,我们需要使用gbk的字符集,因此我们要对mysql进行以下设置,以便其有效的支持中文:
1.修改my.cnf文件
my.cnf文件是mysql的配置文件,我们可以从mysql的安装目录根据其自带模板来
建立
#cp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf
#vi /etc/my.cnf
在此文件中相应位置加入
default-character-set = gbk
########################
[client]
default-character-set = gbk
[mysqld]
default-character-set = gbk
#########################
修改结束以后,保存,然后使用客户端登录
#mysql -u root -p
在客户端中输入
status;
显示的数据中如果出现:
Server characterset: gbk
Db characterset: gbk
Client characterset: gbk
Conn. characterset: gbk
则表示修改成功。
2.建立库表时指定gbk字符集
在建立库表的时候我们需要指定gbk字符集
建立数据库:
CREATE DATABASE dbname DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci
建立数据表
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 gbk
jsp连接mysql需要使用jdbc驱动,在使用的时候,我们需要设置好字符集
String user="root";
String password="123";
String url="jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=gbk"
Class.forNname("com.mysql.jdbc.Driver");//装载驱动类;
Connection con=DriverManager.getConnection(url,user,password);//取得连接
其中dbname为你数据库的名字,url中的gbk即为使用的字符集
做好以上三步以后,mysql就可以支持gbk中文了。
[quote]
Incorrect string value: '\xD6\xD0\xB9\xFA' for column 'url_name' at row 1"
[/quote]
中文貌似被某种形式转码了,这是怎么回事?LZ确认下.
乱码问题处理汇总
一、避免乱码的一些注意点:
1.尽量使用统一的编码,如果你是重头开发一个系统,特别是Java开发的,推荐从页面到数据库再到配置文件都使用UTF-8进行编码,安全第一。
2.SetCharacterEncodingFilter的使用,这个东西不是万能的,但是没有它就会很麻烦,如果是基于Servlet开发的东西,能用的就给它用上,省心。不过有一个注意的地方,这个Filter只是对POST请求有效,GET一律忽略,不信你可以debug一下,看看它怎么做的,至于为什么不过滤get请求,好象是它对GET请求是无能为力的。
3.就如上面所说,GET请求有问题,尽量使用POST请求,这个也是Web开发的一个基本要领:
Web Health Warning:Put All Destructive Actions Behind a POST method(from Agile Web Development with Rails)
有点扯远了,不过少用GET,是会有回报滴。
4.JavaScript和Ajax乱码的避免,注意JavaScript默认是ISO8859的编码,避免JS/AJAX乱码和GET一样,不要在URL里面使用中文,实在避免不了,就只能在生成链接的时候转码,绝对不能想当然的认为SetCharacterEncodingFilter会帮你做什么事情。
5.尽早统一开发环境,早点模拟真实环境测试,这个好像也有跑题的嫌疑,但凡软件开发都是这么干的,但仍然值得注意。我这出现过一次状况,程序是在Win下编译的,拿去Linux上测试没问题,等实际部署的时候代码是在Linux下编译,结果乱码,秋后算帐总觉得有点晚。
二、乱码发生的情况和应对措施
1.开发环境乱码
由于Java默认使用UTF-8编码,而且网上很多人都建议Struts开发的时候应尽量选用UTF-8做为默认编码,而非GBK。IDE使 用Eclipse,在第一次使用Eclipse的时候应将default text editor改为UTF-8编码,免得日后后悔再改就惨了,我本次开发的时候就忽视了这一点,刚开始没注意,结果到快交工时乱码问题无法解决,导致将所有 的文件全部修改一遍,呜……
自打使用Ubuntu,我就开心的笑阿,再也不用为搞这些乱码问题而烦恼^^(Ubuntu公益广告)
2.POST请求的过滤
这个是最基本的了,每个Servlet系统基本都会用到这个东西。不过只对POST请求有效,这个挺关键的。
使用SetCharacterEncodingFilter,这个很基础的一套过滤器,将所有来自页面的POST请求全部过滤为UTF-8编码。
3. JSP ,HTML页面乱码
将JSP页面全部改为charset=UTF-8,这样可以保证与后台交互的时候都是UTF-8编码,一般应用做了以上工作就基本可以应付了。
4.资源文件中汉字转化UTF-8字符问题
国际化问题,在使用资源文件的时候,由于中文在properties文件中无法被程序所识别,需要将其进行转码,我在资源文件下面制作了一个很简单的 bat文件,每次修改资源文件的时候都是在一个临时文件中修改,然后执行这个bat文件,将其转化并保存为所需要的资源文件,这个动作挺烦的,也有项目组 成员使用一些插件,但是那些东西都是直接写UTF-8码的,有时候反倒不方便,不过以后任务量巨大的时候可能会考虑使用。Bat文件内容: set path=%path%;%JAVA_HOME%/bin/,native2ascii -encoding UTF-8 ApplicationResources_bk.txt > ApplicationResources_zh.properties
PS:上面的方法好老了,实际操作起来相当麻烦,现在基本都是使用Eclipse插件,Eclipse3.1时使用PropertyEditor,但是这 个项目看上去好像停摆了,到Eclipse3.2时改用了ResourseBundle,相当的强劲的一个插件,推荐使用。
8.乱码仍然是偶们的心病,一直牵动着大家的心,最近一位朋友说连接MSSQL数据库有乱码,使用了很多办法,都没解决,后来重新下了个新的驱动搞定……
数据库乱码其实也很讨厌的,一般来说驱动问题比较常见,所以一旦碰到比较难缠的乱码可以先考虑下换换驱动。也有如MySQL这种,直接连接的时候就需要显示进行编码转化的,这个就要不同情况区别对待了。
//2007年11月30日添加
9.WebService乱码,由于对WebService不怎么熟悉,使用的是Weblogic提供的WebService支持,乱码再次出现搞得手忙脚乱,而且无从下手,在自己系统上跑都没有问题,结果跑到服务器上就全乱套,又无法调试,愁人。
反复尝试的过程就不说了,绝对比普通的Web开发麻烦的多。最终解决方法:
A.为WebService服务也加上一个filter,WebService也是走HTTP协议的,这个东西同样有用,先得加上。
B.修改服务器上的环境变量,LANG=zh_CN.UTF-8,改成这个是为什么我仍然说的不是很清楚,不过当时开发人员就是在Win下开发的,我在自己的Ubuntu上测试没问题,拿到Redhat服务器上就不行,因为服务器上默认的是LANG=en_US.UTF-8,这个明显是不支持汉字的。
经过这两个步骤WebService乱码总算得到抑制,它主要的麻烦在于所有与协议有关的东西都被Weblogic包办,里面做什么事情我们不好控制,所以只能采取这种比较笨的办法,虽然解燃煤之急但无法寻根溯源的搞定它,说不定哪天又会出来搞鬼。果然又一次出现乱码问题,经过比较环境变量发现服务器上的LC_CTYPE被修改了,所以强制改成LC_CTYPE=zh_CN。修改环境变量的方法不到万不得已不推荐使用。
[quote]但是以前开发的时候,采用的编码方式是gbk[/quote]
[quote]characterEncoding=GB2312[/quote]
是你新加的那个功能出的问题吗?
我也遇到过这中问题,处理的方式是:
1.jsp页面使用的是gbk
2.tomcat下的conf下的server.xml中在
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />后面加上 URIEncoding="GBK"
3.在action中做了以下操作:
empName=empName.replaceAll("\*", "%");
empName=URLDecoder.decode(empName,"utf-8");
empName是页面上传过来的属性
你可以试试看,我这样做之后是OK了的
那你只能后台把得到的参数值手动转码一下,
可以写个通用的方法,或加个过滤器进行转码,试看看吧