特殊字符

时间:2016-11-10 17:37:54

标签: php mysql mysql-workbench

我在某个提供商中托管了一个MySQL数据库。在过去的3年里,一切都运行良好但不知何故,从昨天开始,所有特殊字符现在都显示无效字符。例如:

'sugestão' now shows as 'sugestão'

我没有对数据库进行任何更改,主机公司声称他们无能为力。而且最奇怪的是,新的内含物不会受到这个问题的影响,只有昨天之前的数据。

我知道主机后端发生了一些事情,但他们拒绝承认,因为他们声称他们没有任何日志来证明我没有更改数据库字符集或整理。但当然,我知道我没有这样做,这是一个运行3年的应用程序,从来没有遇到过这个问题。

所以我自己通过在每个表中手动更新所有具有此类问题的列来解决问题。有没有办法在MySql Workbench本身内更快地完成这项工作,而不是为它创建一些应用程序?

例如,我有一个名为'CRM'的表。以下是一些示例结果集:

select * from crm;
cr_date     cr_history
2016-07-11  Quer sugestão 
2016-07-11  País de destino : Canadá

以下是此结果集在问题出现之前的样子以及我需要如何修复它以便再次回顾:

select * from crm;
cr_date     cr_history
2016-07-11  Quer sugestão 
2016-07-11  País de destino : Canadá

有没有办法进行更新查询,将列中的所有'Ã'字符串更改为'ã',保持列内容的其余部分完好无损?

这样的事情:将字段中的所有ocurencies替换为'ã'。像PHP的str_replace,但直接在Mysql中。

只是为了添加更多信息,它是由PHP应用程序访问的数据库,但问题是直接从MySQL Workbench访问数据库,因此它不是PHP相关的问题。

提前致谢!

1 个答案:

答案 0 :(得分:2)

当在ANSI(或其他非UTF)列中存储UTF-8数据时,这是非常典型的(并且经常看到)结果。 PHP似乎特别容易出现这种类型的错误(我以前见过几次)。因此,在检索数据时,它会在列的编码中进行解释而不是其真正的编码 - 因此显示错误。

您可以通过以下方式轻松查看:

mysql> SELECT CAST(_latin1'müller' AS CHAR CHARACTER SET utf8);
+---------------------------------------------------+
| CAST(_latin1'müller' AS CHAR CHARACTER SET utf8)  |
+---------------------------------------------------+
| müller                                           |
+---------------------------------------------------+
1 row in set (0,00 sec)

mysql> SELECT CAST('müller' AS CHAR CHARACTER SET utf8);
+--------------------------------------------+
| CAST('müller' AS CHAR CHARACTER SET utf8)  |
+--------------------------------------------+
| müller                                     |
+--------------------------------------------+
1 row in set (0,00 sec)

您可以做的是为该列设置正确的编码({My} SQL中的charset)。您可以使用ALTER TABLE命令,但这会进一步搞乱现有值(它会尝试再次以UTF-8重新编码已经UTF-8编码的值)。所以更好的方法是:

  • 使用UTF-8字符集+整理添加新列。
  • 更新您的表格并将新列的值设置为旧列的值。这里重要的是to cast旧列的charset到它的真值(UTF-8)。这不会转换数据,只是将现有字节存储在新列中,但这次使用正确的编码。
  • 完成后,删除旧列并将新列重命名为旧名称。

使用这个附加列,您可以确保不会丢失数据(仍然建议备份),如果出现问题,您可以将其删除并重新开始。

相关问题