我正在使用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 |
当我直接通过JDBC(不使用Ajax调用)插入非英语字符时,它显示为“ ????”。 在数据库中。
只有当双方都完全意识到双方的字符编码差异时,才会发生这种情况。任何未在另一侧使用的字符编码覆盖的字符都将被问号替换?。否则,您会看到Mojibake的。
?
在这种特定情况下,这些方面是Java方面和数据库方面,而JDBC驱动程序作为中介。要解决此问题,您需要告诉JDBC驱动程序这些字符的编码方式。您可以通过useUnicode=true&characterEncoding=UTF-8在JDBC连接URL中设置参数来实现。
useUnicode=true&characterEncoding=UTF-8
jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8
然后,根据您如何将参数从客户端发送到服务器,您可能还需要修复请求编码。考虑到您在删除时看到Mojibake的事实request.setCharacterEncoding("UTF-8"),因此您正在使用POST。所以那部分很好。
request.setCharacterEncoding("UTF-8")
对于这种情况,如果使用GET发送参数,则需要在服务器端配置URI编码。目前尚不清楚您使用的是哪台服务器,但是例如对于Tomcat,只需按以下步骤编辑<Connector>条目即可/conf/server.xml:
<Connector>
/conf/server.xml
<Connector ... URIEncoding="UTF-8">