即使将字符集和校对更改为utf8,也无法将中文,俄语等字符存储到mysql表中

时间:2017-10-06 05:38:09

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

我有一个屏幕,用户可以在其中查看英语单词并输入任何语言的等效翻译。

我的数据库创建查询:

CREATE DATABASE IF NOT EXISTS lang_db
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;

我的表创建查询:

CREATE TABLE lang_map (
WORD         VARCHAR(2048) NULL,
DESCRIPTION     VARCHAR(2048) NULL
) CHARACTER SET utf8 COLLATE utf8_general_ci; 

我在json中获取了单词和描述,我在java中读取然后触发查询以插入到表中。但对于像中文或俄文这样的语言,只插入了?的内容。

Mysql版本:5.5 Java:1.6

更新: Java代码:

控制器处理ajax调用。

@ResponseBody
public setChanges(@RequestBody JSONObject keyValueMap) throws Exception {
    return myService.setChanges(keyValueMap);
}

服务代码

List<LangMapping> langMappings = new ArrayList<LangMapping>();
for(Object keyObject : changedKeyValueMap.keySet()){ 
    String key = String.valueOf(keyObject) ;
    String description = (String) changedKeyValueMap.get(key);
    langMappings.add(buildLangMapping(key,localeCode,description)); //pojo
}
//using above array list i am inserting into database table

2 个答案:

答案 0 :(得分:0)

您必须确保在应用程序的每个阶段使用正确的编码。最简单的方法通常是在所有情况下使用相同的编码,在您的情况下使用UTF-8。

要调试您的问题,您可以按照以下步骤操作:

  1. 使用像Notepad ++这样的优秀文本编辑器,打开一些你得到的JSON文件,检查它们是否被正确编码(即俄文/中文/任何字符是否正确显示),并检查编辑器是否有自动检测到JSON文件的编码为UTF-8。

    如果您没有将源JSON数据作为文件,但将其作为对某些Web请求的响应,请尝试使用wgetcurl等工具将其转储到文件中,像上面描述的那样检查该文件。

  2. 在使用JAVA读取JSON输入后,在进一步处理之前从JAVA中转储输入。我不了解JAVA,但这是一个普遍的问题,你必须告诉你的编程语言/图书馆/文件打开函数输入是如何编码的。

    如果你不这样做这样做,JAVA可能会假设JSON输入是一些默认编码;如果出错,读入的数据将是垃圾。

    同样,在转出你读过的内容之前,告诉JAVA应该如何编码输出。如果转出到控制台,请确保控制台也使用您期望的编码。

    请注意,对于使用CGI机制的Web应用程序也是如此(几乎所有人都这样做)。在此上下文中,标准输入和标准输出可视为普通文件。

    当然,如果JAVA的文件和标准I / O的默认编码已经是UTF-8,您可以省略这一步。

  3. 如果您还没有发现问题,请告诉您的数据库驱动程序您正在发送UTF8编码数据,并且您希望获得UTF-8编码数据。由于我不使用JAVA,我不知道如何做到这一点,但我确信它在文档中有描述。

  4. 如果它仍然不起作用,告诉MySQL连接和客户端使用UTF-8(只要你的驱动程序在执行第3步后没有自动执行)。使用SET SESSION character_set_x = 'utf8'之类的语句,其中x分别代表clientresultsconnection。连接到数据库后,每次都必须立即执行此操作(当然,只有在连接时,驱动程序不会自动执行此操作,具体取决于其运行时或静态配置)。

  5. 如果您按照这些步骤操作,您将有望找到问题所在。让我们知道它是怎么回事。

答案 1 :(得分:0)

UTF不保存俄语,中文,德语等其他语言的所有字符。 您可以参考Differences between utf8 and latin1