一尘不染

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

jsp

我正在使用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                         |

阅读 270

收藏
2020-06-08

共1个答案

一尘不染

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

只有当双方都完全意识到双方的字符编码差异时,才会发生这种情况。任何未在另一侧使用的字符编码覆盖的字符都将被问号替换?。否则,您会看到Mojibake的

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

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

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

对于这种情况,如果使用GET发送参数,则需要在服务器端配置URI编码。目前尚不清楚您使用的是哪台服务器,但是例如对于Tomcat,只需按以下步骤编辑<Connector>条目即可/conf/server.xml

<Connector ... URIEncoding="UTF-8">
2020-06-08