在MySQL数据库中插入非英文文本时的JSP编码

时间:2011-11-29 13:23:44

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

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

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

当我加入时

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

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

  

????????

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

  

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

而实际值是

  

મખપષ

所以实际问题在于通过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,我可以通过终端正确输入非英文文本。

这个问题是如何引起的?如何解决?

现在,我只能使用insert语句编写....但是当我混合一些查询并插入语句时...我的应用程序返回以下错误: 操作'='的非法混合排序(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                         |

3 个答案:

答案 0 :(得分:3)

  

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

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

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

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

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

对于这种情况,如果您使用GET发送参数,则需要在服务器端配置URI编码。目前还不清楚你正在使用什么服务器,但是在例如Tomcat的情况下,需要编辑<Connector>中的/conf/server.xml条目,如下所示:

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

另见:

答案 1 :(得分:0)

  

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

您需要弄清楚处理链中的情况。

您说您已正确创建表格,并且您可以输入并显示终端中的文本。您已知某事正确处理这些字符,因此请尝试以下实验... 按此顺序 ...以隔离出错的地方。< / p>

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

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

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

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

答案 2 :(得分:0)

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

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

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

当然,一个人应该非常小心,因为显示程序可能没有使用UTF-8,因此可能会显示正确的数据,因此可能会错误地显示正确的数据。 / p>