正在修复MySQL的黑钻石

时间:2010-09-23 23:28:39

标签: php mysql

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

4 个答案:

答案 0 :(得分:2)

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

以下是我的工作:我将所有网页声明为UTF-8编码,在<head>部分的开头使用以下标记:

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

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

SET NAMES uft8

(根据您使用的数据库抽象方法,可能会建议使用特殊函数来设置连接字符集,如mysqli的mysqli_set_charset()。)

我还要确保我打算存储UTF-8数据的那些列被声明为UTF-8。您可以通过发出SHOW CREATE TABLE table_name来找出列的字符集。表的字符集(默认情况下是表中任何列的字符集)显示在末尾。如果列的字符集与表的默认字符集不同,则它将显示为列定义的一部分。如果您希望更改列的字符集,则可以使用ALTER TABLE

如果您之前没有采取过处理应用程序中字符集的步骤,那么您可能会发现这些表都使用latin1字符集。如果您天真地将UTF-8编码的数据(例如)存储到这些列中,则可能会遇到字符编码问题。使用ALTER TABLE更改列字符集不一定能修复旧数据,因为MySQL会读取旧数据,假设它是有效的latin1 - 编码文本并将其转换为等效的UTF-8(正确转换)它读了什么,但没有给出你想要的结果。)

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

答案 1 :(得分:0)

几年前遇到这个问题...我记得找到那些臭名昭着的角色,并在php中用单引号或双引号替换它们......当然有逃避......这些角色的简单preg_replace将会诀窍......它只是一个编码问题......

答案 2 :(得分:0)

这个页面,虽然适合wordpress可能有帮助

http://codex.wordpress.org/Converting_Database_Character_Sets

答案 3 :(得分:0)

我遇到了同样的问题(mysql编码和网页编码设置为UTF-8但黑色钻石显示在我的查询结果中。我在谷歌搜索时发现了这个片段,但在我的生活中找不到它的来源给出正确的归属:

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

无论如何,它为我解决了这个问题。