【发布时间】: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 是我要插入的字符串在数据库中。也没有运气。