【问题标题】:JSP, MySQL and UTF-8JSP、MySQL 和 UTF-8
【发布时间】:2012-07-13 10:25:02
【问题描述】:

我通过表单输入的国际字符没有完全按照输入的方式存储,并且存储的数据没有按照存储在数据库中的方式返回。

如果我输入“çanak çömlek patladı”并在我使用的表单上单击保存,页面会显示“çanak çömlek patladı”,但数据库已存储“çanak çömlek patlad?如果我再次访问该页面,我会得到 '￧anak ￧�mlek patlad?'' 如果我单击表单上的保存而不更改数据库存储的任何内容 '?anak ??mlek patlad?'并且浏览器显示'?anak ??mlek patlad?'

我的 MySQL 服务器具有以下配置:

default-collation=utf8
collation_server=utf8_unicode_ci
character_set_server=utf8
default-character-set=utf8

数据库字符集为utf8,数据库排序规则为utf8_unicode_ci,我使用的表设置为相同。

我的 JSP 文件的第一行是:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

html头是这样的:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>

我编译了一个 EncodingFilter 类,它是:

import java.io.IOException;
import javax.servlet.*;

public class EncodingFilter
    implements Filter
{

    public EncodingFilter()
    {
    }

    public void init(FilterConfig filterconfig)
        throws ServletException
    {
        filterConfig = filterconfig;
        encoding = filterConfig.getInitParameter("encoding");
    }

    public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
        throws IOException, ServletException
    {
        servletrequest.setCharacterEncoding(encoding);
        filterchain.doFilter(servletrequest, servletresponse);
    }

    public void destroy()
    {
    }

    private String encoding;
    private FilterConfig filterConfig;
}

这个类在我的web.xml文件中引用如下:

<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

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

我已经重新启动了我的系统,因此重新启动了 Tomcat 和 MySQL 服务器,检查了日志,上面的任何配置都没有错误。

谁能帮帮我,否则我的头发就没有了?

【问题讨论】:

  • 我刚刚运行了 SHOW VARIABLES LIKE "%character%";在我的 MySQL 服务器上并获得以下结果: 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 C:\\Program Files (x86)\\MySQL\\MySQL Server 5.1\\share\\charsets \\
  • 如果我尝试在公司字段中手动输入“çanak çömlek patladı”,我收到以下错误:1366 - 不正确的字符串值:第 1 行的“公司”列的“\xC4\xB1”任何人都可以阐明这一点。

标签: mysql jsp tomcat utf-8 internationalization


【解决方案1】:

解决了,我放弃了以前的 db java 类并编写了一个新的 db 函数,因为以前开发的类似乎导致了双重编码问题。

在手动将“çanak çömlek patladı”手动输入到数据库时,我遇到的错误与 MySQL 没有真正在 varchar 字段上处理 UTF-8 的问题有关。将字段更新为 varbinary 后,一切正常。

我希望这对某人有所帮助,我相信我的头发会重新长出来,感谢所有提供建议的人。

【讨论】:

  • MySQL 在 VARCHAR 字段中处理 UTF-8 字符很好:您只需确保将字段本身的字符编码设置为“utf8”。请看下面我的回答。您的代码根本不应该编码任何东西——即使是一次,更不用说两次了。您应该使用 PreparedStatement.setString 来处理所有事情(db 字段中的编码除外)。
  • 关于您的评论“很好”,这取决于您使用的 MySQL 版本是否存在已知错误。正如我在我的案例中发现的那样,Varchar 将适用于一些但不是全部。如果您查看此页面上的所有 cmets,您将看到我提供了所有预期 UTF-8 编码的证据,包括来自 MySQL 和 JSP。最后我使用以下内容进行更新: sql = "UPDATE contact SET company WHERE ID="+getContactID()+""; rs = Conn.prepareStatement(sql); rs.setString(1,公司); rs.executeUpdate();再次,我希望这对某人有用。
  • 我使用了 MySQL 4.1 到 5.2 版本,它们都按预期工作。不过,也许我的期望与您的不同。如果有已知的错误,请提供参考。您的示例 JDBC 代码没有任何意义。
  • Matt,这是一篇很棒的博文:感谢您进行研究并详细解释问题。
【解决方案2】:

在从数据库中检索任何内容之前,执行SET NAMES UTF8 查询,然后执行所有查询。然后,您将获得字符的外观。

【讨论】:

  • 为了澄清,我是否添加了类似 rs.executeQuery("SET NAMES 'UTF8'");每个请求数据的查询?
  • 不是每个查询。就在脚本的开头。
  • 所以像这样:Statement rs = conn.createStatement(); rs.executeQuery("SET NAMES 'UTF8'"); rs.executeQuery(sql); rs.close();
  • 是的。 Statement rs = conn.createStatement(); rs.executeQuery("SET NAMES 'UTF8'"); rs.executeQuery(sql); /*many many other statements to fulfill your needs*/ rs.close();
  • 好吧,我不是这方面的专家,但我建议mysql服务器中的数据采用utf8格式。我做了一个 3 种语言的网站,并将所有内容存储在 utf8 中(每种其他条件都相同),并且通过这个光荣的查询,它可以根据需要检索数据 :) 希望它能为你解决问题 :)
【解决方案3】:

您需要检查以下事项:

  1. 您的数据库应该支持多语言(如果是 MySQL,在安装时它会要求您提供此选项)。

【讨论】:

  • 是MySQL,我只是在本地实例上进行了默认安装,但预装了云实例。
【解决方案4】:

以http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8开头

您在 MySQL 中的字符保存列必须能够接受 UTF-8 字符。大多数 MySQL 的默认值是 latin1 字符集,除非您的 DDL 脚本为列设置字符集。

如果您想将表从一种编码更改为另一种编码,您可以这样做:

mysql> ALTER TABLE t CONCERT TO CHARACTER SET 'utf8'

如果您真的愿意,我认为您也可以逐列执行此操作。请注意,对于具有大量数据、大量索引等的表,ALTER 可能需要很长时间。

【讨论】:

  • 表和数据库已经设置为charset utf8和collat​​ion utf8_general_ci
  • 我已经阅读了wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8 的文章,据我所知,我已经设置了需要设置的Tomcat、JDBC、MySQL 和JSP。我可能错过了一些东西,但是来回浏览了这么多文章,仍然没有快乐。
  • 我刚刚将 添加到我的页面,并且可以确认正在返回 UTF-8。
  • 另外 返回 utf8。
  • 我刚刚编写了以下代码来测试从表单提交的数据实际上是 UTF-8 并且我可以确认页面正在正确发送国际字符,因为我输入了 'çanak çömlek patladı' 和 ' çanak çömlek patladı' 在文本文件中:
【解决方案5】:

当你连接到你的数据库时,你能确定你将“characterEncoding”设置为“utf8”吗? 另外,如果您在浏览器(例如 fox)中打开页面,显示的字符编码是什么?

我认为你应该尝试一下“divide et impera”。了解 MYSQL 是否是问题很重要(我怀疑不是)。为此,您可以在应用程序中插入 UTF 字符串并将其保存到数据库中。如果这不起作用,我们知道问题出在 mysql 上。如果它工作,它可能是 servlet。

在 servlet 级别添加它不会有什么坏处:

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

【讨论】:

  • 抱歉,我忘了说我的数据库连接具有以下参数 useUnicode=true&characterEncoding=UTF-8 并且 Firefox 将字符编码显示为 Unicode (UTF-8)。
  • 你的tomcat呢?它应该从 CATLINA_OPTS -Dfile.encoding=UTF-8 中包含的以下内容开始
  • 在我的 server.xml 文件中,我有以下内容:
  • @mihaisimi setting file.encoding 几乎没有帮助解决这个问题,因为所有这些设置都有某些默认值(通常是 ISO-8859-1)并且在其他地方设置。
  • 能否请您强调可能是什么问题以及如何解决。我已经非常广泛地评论了整个页面中应用了哪些设置,我很高兴听到您或其他干草的有用建议。
【解决方案6】:

我遇到了字符编码问题(JSP-Mysql)。我写了 字符串 URL = "jdbc:mysql://localhost/deneme?useUnicode=true&characterEncoding=ISO-8859-1"; 并解决了问题。但是,数据库的表必须UTF-8。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2011-01-01
    • 2011-02-26
    相关资源
    最近更新 更多