您的连接字符集似乎设置不正确,因此从编程语言字符集到数据库的转换不正确。
您应该在连接中设置字符集,然后两者都可以正常工作。
正如评论中所指出的,对事情的运作方式进行了一些解释。
当您没有在连接中设置字符集时,服务器假定它与数据库的搭配相同。当以另一种编码接收数据时,仍然会写入数据。只是在脚本数据的编码中使用了错误或其他字符。
只要没有任何变化,脚本就会返回与写入相同的数据,并且一切似乎都很好。
但是,当此时连接编码或数据库编码发生更改时,已存储的数据将转换为新编码。这里的问题是源数据不在转换时假定的编码中。
所有编码都使用相同的位共享 ascii 集,这就是 ascii 字符不会弄乱的原因。只有特殊字符才会这样做。
所以你必须设置你的连接编码,以免产生你已经处于的混乱状态。
现在您可以对已有的数据做些什么?
您可以使用 mysqldump 转储数据库并使用该--skip-set-charset
选项。然后你得到一个纯文本文件。在这个平面文本文件中,将所有出现的实际数据库字符集替换为数据真正所在的字符集(写入数据时脚本中的字符集)。
然后保存文件并确保您的编辑器不进行任何转换(我推荐 vim)。
然后导入该文件,您将获得一个包含正确编码数据的数据库。然后你可以改变你喜欢的编码,只要你的连接字符集得到设置,你从现在开始就可以了。
还要确保 mysql 服务器安装了字符集,但它应该已经安装了。
这只是我的方法,我已经清理了很多这样的混乱安装。其中大多数在某些时候在他们的项目中出现了乱码(在切换服务器、更新或恢复备份之后......)。事实证明,不设置连接字符集是经常被遗忘的东西。