我正在使用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 |
答案 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>
使用mysql
命令,尝试插入包含问题字符的行,然后选择并显示插入的行。
使用应用程序当前正在执行的JDBC URL编写一个简单的Java程序来执行相同的操作。
修改您的应用以捕获并记录它从浏览器接收的请求参数字符串。
(如果可能)捕获服务器收到的请求以及浏览器发送的请求。检查请求参数和标题。
答案 2 :(得分:0)
一旁: 将指令放在一起,没有空格。 (您甚至可以将单个@page内的属性组合在一起。)因为在 HTML内容写入之前应该设置HTTP标头。由于页面缓冲,这不是严格需要的,但正式是肯定的。
到目前为止,其他答案都是正确的。
另一个问题是数据库,表和字段定义,它们都可以具有默认和实际字符集。
当然,一个人应该非常小心,因为显示程序可能没有使用UTF-8,因此可能会显示正确的数据,因此可能会错误地显示正确的数据。 / p>