繁体   English   中英

MySQL在特殊字符上的错误

[英]MySQL error on special chars

我在某个提供程序中托管了一个MySQL数据库。 在过去的三年中,一切正常,但是从昨天开始,不知何故,现在所有特殊字符都显示为无效字符。 例如 :

'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á

有没有一种方法可以执行更新查询,以将列中的所有“⣔字符串更改为“ã”,从而使其余列内容保持不变?

像这样:将字段中所有出现的“Ô货币替换为“ã”。 类似于PHP的str_replace,但直接在Mysql中。

只是为了添加更多信息,数据库是由PHP应用程序访问的,但是问题发生在直接从MySQL Workbench访问数据库的过程中,所以这不是与PHP相关的问题。

提前致谢 !

当某物将UTF-8数据存储在ANSI(或其他非UTF)列中时,这是非常典型的(并且经常看到)结果。 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字符集和排序规则的新列。
  • 更新您的表,并将新列的值设置为旧列的值。 这里重要的是旧列的字符集,以它的真实价值(UTF-8)。 这不会转换数据,而只是将现有字节存储在新列中,但是这次使用正确的编码。
  • 完成后,删除旧列,然后将新列重命名为旧名称。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM