2010-09-23 15 views
0

我遇到了一个我正在处理的网站的一个非常奇怪的问题。该网站基本上是一个工作委员会,所有者或用户可以创建工作列表,其中包括最终被存储到MySQL文本字段中的描述。我们正在经历的是,每当输入来自某些源的列表时,它们最初都会以带有问号的“黑钻石”结尾,代替撇号和双空格。这部分我知道是一个编码问题,可以纠正。真正的问题是,这些黑色菱形显示记录显示在MySQL管理工具中,以及在Web浏览器中查看作业列表时(简单的select语句在PHP应用程序中显示列表),但在第一次被查看,然后问题以某种方式修复自己。这就像运行选择然后显示记录更新工作描述字段并修复编码问题。这怎么可能?有没有人听说过这个或类似的东西?我无法理解一个数据库字段会在几年前更改,恕不运行update语句...在MySQL中修复自己的黑钻石

回答

0

碰到这个问题......我还记得那些寻找臭名昭著的人物,并用单引号或替换它们在PHP双引号...当然与逃避...一个简单的preg_replace这些字符将做的伎俩...它只是一个编码问题...

2

工作列表是如何进入的?他们是通过网页输入的吗?如果是这样,网页使用什么字符编码? (这应该确定提交的数据AFAIK的字符编码。)什么字符集是用于与MySQL通信的连接?数据存储在列中的字符集是什么?最后,检查输入数据的网页的字符编码是什么?

这里是我做的:我宣布我的所有网页为UTF-8编码,使用下面的标签在<head>节开始:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

我立即发出以下命令当我连接到MySQL,这样才能确保MySQL的理解我发送给它的数据将是UTF-8编码:

SET NAMES uft8 

(根据您所使用的数据库抽象方法,可能为了要推荐给特殊功能设置连接字符集,如mys qli的mysqli_set_charset()。)

我也确保那些我打算存储UTF-8数据的列被声明为UTF-8。您可以通过发行SHOW CREATE TABLE table_name来找出列的字符集。表格的字符集(默认为表格中任何列的字符集)显示在末尾。如果该列的字符集与该表的缺省字符集不同,那么它将显示为列定义的一部分。如果你想改变列的字符集,那么你可以使用ALTER TABLE

如果您之前没有采取措施来处理您的应用中的字符集,那么您可能会发现这些表均使用latin1字符集。如果您将UTF-8编码数据(例如)天真地存储到这些列中,则可能会遇到字符编码问题。更改使用ALTER TABLE不一定解决您的旧数据,因为MySQL读取旧的数据假设它是有效的latin1 -encoded文本,并将其转换为eqivalent UTF-8(正确地转换一下,有读取该列字符集,但不给你想要的结果)。

以上步骤可能意味着将来的数据将被正确编码并正确显示,但是您的数据已经在您的数据库中被错误编码了,因此请注意,如果您按照上述步骤仍然看到较旧的数据显示不正确的,这可能是为什么。祝你好运。

0

我有同样的问题(MySQL的编码和网页的编码设置为UTF-8,但黑钻石展示我的查询结果中,我发现这个片段,而谷歌搜索,但不能为我的生活找到它的源头给适当的归属:

if(function_exists('mysql_set_charset')){ 
    mysql_set_charset('utf8', $db_connection); 
}else{ 
    mysql_query("SET NAMES 'utf8'", $db_connection); 
} 

无论如何,它清除了这个问题对我来说