保存非英语字符时发出问题

Yog*_*ati 5 mysql spring hibernate spring-mvc utf-8

我们正在使用一个我们需要用语言保存数据的应用程序Gujarati.

Applcation中使用的技术如下所列.

  • Spring MVC Version 4.1.6.RELEASE
  • Hibernate版本4.3.5.Final
  • MySQL 6.0.11

我的JSP配置了

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Run Code Online (Sandbox Code Playgroud)

Hibernate配置是

<prop key="hibernate.connection.useUnicode">true</prop>
<prop key="hibernate.connection.characterEncoding">UTF-8</prop>
<prop key="hibernate.connection.charSet">UTF-8</prop>
Run Code Online (Sandbox Code Playgroud)

MySQL URL是

jdbc:mysql://host:port/dbName?useUnicode=true&connectionCollation=utf8_general_ci&characterSetResults=utf8
Run Code Online (Sandbox Code Playgroud)

Pojo有String字段来存储该数据.

MySQL具有VARCHAR使用charset = utf8Collat​​ion = utf8_general_ci存储数据的数据类型

当我试图保存任何非英语(古吉拉特语)字符时,它会显示一些垃圾字符,如àª?à«?àª?"ગુજ".

有没有我错过的其他配置.

Ven*_*san 7

在将" 泰米尔 "字符插入数据库时​​,我遇到了同样的问题.经过大量的冲浪,我得到了一个更好的工作解决方案,它解决了我的问题.我在这里与你分享我的解决方案.我希望它能帮助你清除您对非英语角色的疑虑.

INSERT INTO 
STUDENT(name,address) 
VALUES 
(N'?????', N'??????');
Run Code Online (Sandbox Code Playgroud)

我正在使用一个示例,因为您没有提供任何表和字段名称的结构.

  • 这并没有真正回答这个问题. (4认同)

Ric*_*mes 5

我假设你想要???(GA JA与元音签U)?

我想你以某种方式指定了"latin5".(是的,我发现你到处都有UTF-8,但是"latin5"是我能让事情发挥作用的唯一方法.)

CONVERT(CONVERT(UNHEX('C3A0C2AAC297C3A0C2ABC281C3A0C2AAC29C')
       USING utf8) USING latin5) = '???'
Run Code Online (Sandbox Code Playgroud)

另外,你最终得到了"双重编码"; 我怀疑这是发生的事情:

  • 客户端的字符编码为utf8(好); 和
  • SET NAMES latin5使用了,但它声称客户端有latin5编码而撒谎; 和
  • 表中的列声明CHARACTER SET utf8(好).

如果可能的话,最好重新开始 - 清空表,确保SET NAMES utf8在从客户端连接到数据库时拥有或建立utf8.然后重新填充表格.

如果您希望尝试恢复现有数据,这可能会起作用:

UPDATE ... SET col = CONVERT(BINARY(CONVERT(
                         CONVERT(UNHEX(col) USING utf8)
                         USING latin5)) USING utf8);
Run Code Online (Sandbox Code Playgroud)

但是您需要为每个表中的每个混乱列执行此操作.

对该代码进行部分测试即可

SELECT CONVERT(BINARY(CONVERT(
                         CONVERT(UNHEX(col) USING utf8)
                         USING latin5)) USING utf8)
     FROM table;
Run Code Online (Sandbox Code Playgroud)

我说"部分测试",因为looking权利可能无法证明是is正确的.

之后UPDATE,SELECT HEX(col)获得E0AA97E0AB81E0AA9C???.请注意,大多数 Gujarati十六进制应该是形式E0AAyyE0AByy.您可能还会找到20一个空白区域.

我为不再确定而道歉.我已经解决了角色集问题十年了,但这是一个新的变种.