【问题标题】:JSP encoding while inserting non-English text in MySQL database在 MySQL 数据库中插入非英文文本时的 JSP 编码
【发布时间】:2012-01-08 20:01:09
【问题描述】:

我正在使用 Ajax 调用在 MySQL 数据库中插入印度字符。我在应用程序流之间遇到 UTF-8 编码问题。

当我通过 JDBC 直接插入非英文字符(不使用 Ajax 调用)时,它会显示“????”在数据库中。

当我包括

response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

在我的 JSP 文件中,然后我在我的数据库中收到以下内容(问号而不是非英文字符):

??????????

当我不包含以上行时,它会在数据库中显示像这样的垃圾字符:

મà«?àª?પà«?ષà«?àª

而实际值是

મખપષ

所以实际问题在于通过JDBC jdbc连接器向JSP中的MySQL命令发送插入请求或之后。

我在所有 JSP 文件中都包含以下标签以确保字符编码:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

和

<meta http-equiv="Content-Type" content="text/html; charset=utf-8;charset=UTF-8">

我检查了 MySQL 表是否启用了 Unicode,并且我能够通过终端正确输入非英文文本。

这个问题是怎么引起的,我该如何解决?

现在,我只能使用插入语句来编写......但是当我混合一些查询和插入语句时......我的应用程序返回以下错误: 非法混合排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8_general_ci,COERCIBLE) 用于操作 '=' 以下是我的数据库变量:

| 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       | /usr/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci            |
| collation_database       | utf8_general_ci            |
| collation_server         | utf8_general_ci            |
| completion_type          | 0                          |
| concurrent_insert        | 1                          |
| connect_timeout          | 10                         |

【问题讨论】:

  • 我看到您添加了一个新的、完全不同的问题。请不要那样做。只需按下右上角的 按钮即可提出新问题。
  • 谢谢...对不起,我认为它会保留上下文...

标签: java mysql jsp utf-8 character-encoding


【解决方案1】:

请帮我解决这个问题...

您需要弄清楚处理链中发生的事情。

您说您已经正确创建了表格,并且可以从终端输入和显示文本。您有某些东西 可以正确处理这些字符,因此请尝试以下实验...按此顺序 ...找出问题出在哪里。

  1. 使用mysql 命令,尝试插入包含问题字符的行,然后选择并显示插入的行。

  2. 使用您的应用程序当前正在执行的 JDBC URL 编写一个简单的 Java 程序来执行相同的操作。

  3. 修改您的应用程序以捕获并记录从浏览器接收的请求参数字符串。

  4. (如果可能)捕获服务器接收到的请求以及浏览器发送的请求。检查请求参数和标头。

【讨论】:

    【解决方案2】:

    当我通过 JDBC 直接插入非英文字符(不使用 Ajax 调用)时,它会显示“????”在数据库中。

    只有在双方完全了解每一方的字符编码差异时才会发生这种情况。另一侧使用的字符编码未涵盖的任何字符都将替换为问号?。否则你会看到Mojibake。

    在这种特殊情况下,这些方面是 Java 端和数据库端,JDBC 驱动程序作为中介。要解决此问题,您需要告诉 JDBC 驱动程序这些字符的编码方式。您可以通过在 JDBC 连接 URL 中设置 useUnicode=true&amp;characterEncoding=UTF-8 参数来做到这一点。

    jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8
    

    然后,根据您将参数从客户端发送到服务器的方式,您可能还需要修复请求编码。鉴于您在删除 request.setCharacterEncoding("UTF-8") 时会看到 Mojibake,因此您使用的是 POST。所以那部分很好。

    如果您使用 GET 发送参数,则需要在服务器端配置 URI 编码。目前尚不清楚您使用的是什么服务器,但以 Tomcat 为例,只需编辑/conf/server.xml 中的&lt;Connector&gt; 条目,如下所示:

    <Connector ... URIEncoding="UTF-8">
    

    另见:

    【讨论】:

    • 感谢我能够使用 jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8 插入非英文字符
    • 但实际上我之前使用的是 jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8 连接器字符串,这是我在寻找解决方案时在某处发现的......我在查看您的回复时注意到此处连接器字符串中的问题谢谢
    【解决方案3】:

    另一边: 将指令放在一起,没有空格。 (您甚至可以在单个 @page 中组合属性。)因为 HTTP 标头应该在编写 HTML 内容之前设置。由于页面缓冲,这不是严格需要的,但形式上是的。

    到目前为止,其他答案都是正确的。

    另外一个问题是数据库、表和字段定义,它们都可以有一个默认的和实际的字符集。

    当然应该非常小心,મà«?àª?પà«?ષà«?àª可能是正确数据的错误显示,因为显示程序可能没有使用UTF-8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多