mysql - (JSP) 将 UTF8 写入 MySQL 将不起作用

标签 mysql jsp tomcat utf-8 jstl

我正在尝试使用 JSP (JSTL) 将俄语字符写入 MySQL 5.5。 虽然它可以在我自己的本地主机上运行,​​但我无法让它在我租用的服务器上运行。

它将正确的参数从表单发送到另一个页面,然后正确显示输出。这也适用于服务器。 写入/读取数据库只适用于我自己的本地主机。

如果我尝试写入服务器上的数据库,俄语字符会变成问号。但是,我可以使用 phpMyAdmin 存储俄语字符,然后在我的网页上正确显示。

这是我的查询以及到目前为止我尝试过的内容: 查询:

    <sql:update dataSource="${ds}" var="updatedTable">
        INSERT INTO Question (question) VALUES (?) 
        <sql:param value="${param.questionAsked}" />
    </sql:update>

数据库连接:

    <sql:setDataSource var="ds" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/myDBname?useUnicode=true&characterEncoding=utf-8" user="secret" password="secret" />

每个 JSP 文件中的页面编码:

    <%@page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

将此添加到 tomcat server.xml:

    <Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
URIEncoding="UTF-8"
/>

取消注释 web.xml 中的 CharacterEncodingFilter:

    <filter>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <async-supported>true</async-supported>
</filter>
    <filter-mapping>
    <filter-name>setCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

并更改/创建新的数据库和数据库表以使用 utf8 进行测试:

CREATE TABLE `Question` (
  `questionID` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `question` varchar(255) DEFAULT NULL,
  `categoryID` int(6) unsigned DEFAULT NULL,
  PRIMARY KEY (`questionID`),
  KEY `categoryID` (`categoryID`),
  CONSTRAINT `question_ibfk_1` FOREIGN KEY (`categoryID`) REFERENCES `Category` (`categoryID`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

我想我的问题出在 MySQL 连接器的某个地方。我无法完全弄清楚如何更改它,因为我无权访问 mysql 的配置文件。如果对我有帮助,我请求了 SSH 访问权限。我对这些问题还很陌生,因为我没有太长时间处理数据库,尤其是服务器。

phpMyAdmin 显示:

character set client - latin1, (session value - utf8)
character set connection - latin1, (session value - utf8)
character set database - latin1
character set results - latin1, (session value - utf8)
character set server - latin1
character set system - utf8
collation connection - latin1_swedish_ci (session value - utf8_unicode_ci)
collation database - latin1_swedish_ci
collation server - latin1_swedish_ci

我希望你能建议做什么...

最佳答案

我自己想通了。 仅仅取消对 CharacterEncoding 过滤器的注释是不够的。 我还必须在我的 webapp 中实现一个过滤器。 继承人的代码:

package filters;

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 CharsetFilter implements Filter {
private String encoding;

public void init(FilterConfig config) throws ServletException {
    encoding = config.getInitParameter("requestEncoding");

    if (encoding == null)
        encoding = "UTF-8";
}

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain next) throws IOException, ServletException {
    // Respect the client-specified character encoding
    // (see HTTP specification section 3.4.1)
    if (null == request.getCharacterEncoding())
        request.setCharacterEncoding(encoding);

    /**
     * Set the default response content type and encoding
     */
    response.setContentType("text/html; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");

    next.doFilter(request, response);
}

public void destroy() {
}

}

不要忘记在 web.xml 中:

   <filter>
   <filter-name>CharsetFilter</filter-name>
   <filter-class>filters.CharsetFilter</filter-class>
   <init-param>
    <param-name>requestEncoding</param-name>
    <param-value>UTF-8</param-value>
   </init-param>
   </filter>
   <filter-mapping>
   <filter-name>CharsetFilter</filter-name>
   <url-pattern>/*</url-pattern>
   </filter-mapping>

关于mysql - (JSP) 将 UTF8 写入 MySQL 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096653/

相关文章:

MYSQL匹配添加号码查询

mysql - MongoDB、MySQL 或我的项目的第三种东西?

java - 在 spring mvc 中,如何使用@RequestMapping 链接到另一个 jsp?

javascript - 是否可以在 servlet/jsp 和 javascript 函数之间共享 session 变量?

java - 无法访问tomcat中appbase子文件夹中的文件

java - 跨多个 Web 应用程序的服务器范围功能

java - 有人使用 SpringSource tc 服务器作为 Tomcat 替代品吗?

php - Yii 事务不回滚

php - 使用相同的数据库表数据在每个表行中显示<select>

java - 如何将 .jsp 页眉和页脚添加到我的 Spring MVC Web 应用程序?