我们有一个托管在本地开发服务器和活动站点上的应用程序。我们正在经历UTF-8腐败问题,并正在寻找解决这些问题的方法。
该系统使用symfony 1.0与Propel一起运行。
在我们的开发服务器上,我们运行PHP5.2.0和MySQL 5.0.32。我们没有经历损坏的UTF-8字符在那里。
在我们的活动站点上,PHP5.2.10和MySQL 5.0.81正在运行。在该服务器上,某些字符(如́和Σ)一旦存储在数据库中就会损坏。损坏的字符显示为问号或与相邻问号接近的原始字符。
腐败的例子:
未损坏:́损坏:?
未损坏:Σ已损坏:?
我们目前在开发和活动服务器上都使用了以下技术:
<meta>内容类型值设置为:mb_* (多字节) PHP函数。在现场网站上,我也尝试过添加mysql_set_encoding('ut8', $mysql_connection),但这也没有帮助。我发现了一些新版本的PHP和MySQL错误处理UTF-8字符编码的证据。
发布于 2010-01-19 19:02:44
我们有经验的系统管理员发现了一个修复方法:
alter database DB_NAME character set utf8;
这完全解决了我们的问题。
发布于 2010-01-18 16:26:25
以一个最小的例子为例--提交一个带有Σ字符的表单,并将路径中从浏览器到数据库的位置隔离开来。在从浏览器收到请求后,将bin2hex($str)的值打印到PHP应用程序中的日志中,这是将其传递给数据库之前的最后一件事,以及任何您怀疑可能是问题区域的地方--对于Σ,它应该打印出cea3。在数据库中,对保存的数据运行charset(col)、十六进制(Col)--如果全部正常工作,就应该打印出"utf8","cea3“。
你能更清楚地了解这些字符是如何被破坏的--它们是否显示为空白?像蛋糕一样吗?空的“豆腐”盒子?问题字符处的字符串截断了吗?什么是预期的字节表示和观察到的字节表示?-你将有更多的线索,关于什么可能导致它。
发布于 2010-01-18 15:36:06
注意,如果您使用的是Doctrine或Propel,那么mysql_set_encoding()将不会产生任何效果,因为这两个or都是基于PDO的(Propel < 1.3是基于Creole/Mysqli的)。
https://stackoverflow.com/questions/2086820
复制相似问题