Mysql Unicode字符保存不正确

Mysql Unicode字符保存不正确,mysql,hibernate,jsf,unicode,jdbc,Mysql,Hibernate,Jsf,Unicode,Jdbc,我有一个mysql数据库,其中包含unicode文本字符串。我的JSF应用程序(在Tomcat6上运行)可以读取这些unicode字符串并在浏览器中正确显示它们。所有html字符集都设置为UTF-8 当我保存我的对象时,即使没有做任何更改,Hibernate也会将其保存回数据库。如果我现在直接查看数据库,我会发现带有口音的字符已经变成了垃圾 我的数据库连接字符串是: <property name="hibernate.connection.url"

我有一个mysql数据库,其中包含unicode文本字符串。我的JSF应用程序(在Tomcat6上运行)可以读取这些unicode字符串并在浏览器中正确显示它们。所有html字符集都设置为UTF-8

当我保存我的对象时,即使没有做任何更改,Hibernate也会将其保存回数据库。如果我现在直接查看数据库,我会发现带有口音的字符已经变成了垃圾

我的数据库连接字符串是:

        <property name="hibernate.connection.url"
                  value="jdbc:mysql://database.address.com/dbname?autoReconnect=true&#38;zeroDateTimeBehavior=convertToNull&#38;useUnicode=true&#38;characterEncoding=utf8"/>

将该字符编码更改为UTF-8而不是utf8没有任何区别


事实上,几天前它肯定还在工作,但现在不行了,我不知道该检查什么。你有什么建议吗?我可以提供任何被认为相关的进一步信息。

这只发生在某些表格上吗?这些表的默认字符集可能与其他表不同。()

我想到了一些解决方法:

  • 如果使用facelets,请在页面顶部指定
  • 如果使用JSP,请指定
  • 如果这不起作用,则创建一个映射到Facesservlet的过滤器,并执行
    request.setCharacterEncoding(“utf-8”)

我和你有同样的问题,但是PostgreSQL。您可以使用下面的过滤器。这对我有用。我认为这一定是更好的解决方案,但我还没有找到:/

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class UnicodeFilter implements Filter {

    @Override
    public void destroy() {}

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
         // Set the characterencoding for the request and response streams.  
         req.setCharacterEncoding("UTF-8");  
         res.setContentType("text/html; charset=UTF-8");          
         chain.doFilter(req, res);    
    }  

    @Override
    public void init(FilterConfig arg0) throws ServletException {}

}
在web.xml中:

<filter>
        <filter-name>utffilter</filter-name>
        <filter-class>utils.UnicodeFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>utffilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

乌特菲尔特
utils.unicorfilter
乌特菲尔特
/*
我找到的一个最简单的解决方案是


编码过滤器
org.springframework.web.filter.CharacterEncodingFilter
编码
UTF-8
编码过滤器
/*

确保UTF-8编码页面能够显示特定字符 并正确提交

将此筛选器添加到web.xml


编码滤波器
org.springframework.web.filter.CharacterEncodingFilter
编码
UTF-8
强制编码
真的
编码滤波器
/*

删除
res.setContentType()
,这样做弊大于利。Bozho已经建议使用
req.setCharacterEncoding()
。有关更多详细信息和解决方案,请参见。这基本上只是请求.setCharacterEncoding(“UTF-8”),仅此而已。
 <filter>
     <filter-name>encoding-filter</filter-name>
     <filter-class>
         org.springframework.web.filter.CharacterEncodingFilter
     </filter-class>
     <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
     </init-param>
 </filter>
 <filter-mapping>
     <filter-name>encoding-filter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>