【问题标题】:Insert Chinese characters in MySql database using Java使用Java在MySql数据库中插入汉字
【发布时间】:2017-10-19 12:49:28
【问题描述】:

在我的本地环境中它工作正常,在我的生产环境中,它没有。

我在互联网上阅读了很多答案。看来我没有得到我想要的答案。

我可以从数据库中读取汉字。当我将汉字写入数据库时​​,它们会出现'???'。当我查询数据库找到数据库中的中文条目时,结果集为空。

我使用Java 进行开发,jdk 1.6。 MySQL 服务器:5.0.91

我的 Web 应用程序的网页标题中有 utf-8。在我的 servlet 中,我将字符编码设置为 utf-8. 我的表和表中的列使用 utf8_general_ci

我将?useUnicode=yes&characterEncoding=UTF-8 添加到我的数据库的URL。我在查询之前添加了SET NAMES 'UTF8' COLLATE 'utf8_general_ci'

Character_set_connection = utf8

我注意到在生产服务器上,character_set_server = latin1. 但是,当我将本地环境中的character_set_server 更改为latin1 时,我仍然可以插入汉字。

在我的生产环境中,他们告诉我其他人没有任何问题。

我想我几乎涵盖了许多人的建议。有人知道还有什么问题吗?

更新:在没有好的解决方案的情况下,为需要它的人提供快速的临时修复。

在数据库中插入变量name

使用数据类型varbinary()创建一个新列name_as_bytes

name转换为字节数组
byte[] nameAsBytes = name.getBytes("UTF-8");

在数据库中的name_as_bytes 中插入nameAsBytes

使用 convert() 函数将 name_as_bytes 列复制到 name

update myTable set name = CONVERT(nameAsBytes USING utf8) where ID = id;

由于执行了额外的查询并添加了额外的列,这不是一个理想的解决方案,但它有助于在寻找解决方案的同时让您的网站正常运行。

【问题讨论】:

  • 你有没有尝试一步步调试它,检查你发送到数据库的字符串是否有正确的中文字符?如果您传递字符串并在流等中使用它们,则流也必须使用 UTF8 制作,如果您有时在操作过程中错过了它,您会丢失字符
  • 当我在本地环境中调试步骤时,字符串都显示为正确的汉字,并且它们作为汉字插入到数据库中。
  • 我不知道如何在我的生产环境中逐步调试,我没有自己的服务器。在将字符串插入数据库之前,我使用 logback 将字符串写入输出文件,并且它们在输出文件中显示良好。为了确保我发送的是 utf-8 编码的字符串,我尝试了类似的方法:String nameAsUtf8 = new String(name.getBytes("UTF-8"), Charset.UTF-8),其中 name 是我要插入的字符串在数据库中。也没有运气。

标签: java mysql jdbc


【解决方案1】:

我终于通过两次操作解决了这个问题。
1. 做数据库,用CREATE DATABASE name CHARACTER SET 'utf8mb4';等字符集创建表/数据库
2.做JDBC,在连接url后面加上characterEncodinguseUnicode属性如jdbc:mysql://ip/dbname?useUnicode=yes&characterEncoding=UTF-8

附:使用utf8mb4 而不是utf8,因为后者支持的汉字较少。

【讨论】:

    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 2017-06-20
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多