【问题标题】:Special characters are correctly displayed only when inserted from PHP只有从 PHP 插入特殊字符才能正确显示
【发布时间】:2013-08-10 22:06:25
【问题描述】:

我有表 Users(带有 UTF8 字符集和 utf8_general_ci 排序规则),其中有 lastName 列(与表相同的字符集和排序规则)。当我直接从 Navicat for MySQL 将我的名字 (Štěrba) 插入到这个表和列中时,它在 Navicat 中正确显示,但在浏览器中显示不好(输出文档是 UTF8 并且在 mysql_connect() 之后我也使用 @ 987654326@):

但是当我使用这个查询从 PHP 插入时:

INSERT INTO users (firstName, lastName) values ('Pavel', 'Štěrba');

它在浏览器中正确显示,但在 Navicat 中它是这样保存的:

显然,我不能直接从navicat 编辑它,因为我会破坏它...你知道吗,为什么会发生这种情况?我错过了某个地方的编码吗?还是 Navicat 的问题?感谢您的提示!

【问题讨论】:

  • 貌似是navicat的问题,但我没用过
  • 它在 phpMyAdmin 中的显示方式与在 Navicat 中相同。
  • Navicat 使用什么字符集(charset)?根据您的描述,听起来 Navicat 使用了不正确的字符集(可能是 ISO-8859-1)。

标签: php mysql utf-8 character-encoding navicat


【解决方案1】:

很有可能你做错了,而不是每个人都使用的工具。

不要通过查询摆弄编码设置!使用mysql_set_charset()。

您必须修复数据库中通过 PHP 到达的所有条目。

请注意,“SET CHARACTER SET”是错误的,尽管它听起来是正确的。如果你不能使用上面的 PHP 函数,你应该只使用“SET NAMES utf8”!

【讨论】:

  • 即使我不使用查询并使用mysql_set_charset() 执行此操作,当直接从 Navicat 添加 lastName 时,我仍然会出现损坏的字符...
  • 根据我的另一个进展,我需要修复这些字符的显示,因为当我通过 PHP 保存它时,例如“Š”在数据库中保存为“A”并且这个中断排序.. .
  • 您应该确保在任何地方都使用 UTF-8 编码。是否在 a) HTTP Content-type 标头、b) HTML <meta> 标记和 c) accept-encoding 表单属性中?
  • 哦,这是我的错,因为在我的连接函数中是在mysql_set_charset()之前返回的......愚蠢的错误......无论如何,这个函数和你的解决方案修复了它,非常感谢你!
【解决方案2】:

在SET CHARACTER SET utf8之后也使用SET NAMES utf8

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2020-12-16
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多