【问题标题】:Php + Mysql (UTF-8 ) some characters are still bugPhp + Mysql (UTF-8 ) 一些字符仍然是错误
【发布时间】:2015-01-04 17:19:00
【问题描述】:

我得到了一个 php 脚本,它从 Steam web-api 获取昵称并将它们插入到 mysql 数据库中。他们中的许多人都有罕见的俄语和希腊语字符。我在 php.ini 和所有带有

的 php 文件中将 php 设置为 utf-8
mb_internal_encoding('utf-8');

我的 PDO 连接器配置为处理 utf8

$connection = new PDO('mysql:host=localhost;dbname=d2bd;mysql:charset=utf8mb4', 'root', '');
$connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_PERSISTENT, true);
$connection->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");

我的 mysql 数据库正确配置了 utf8mb4

character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8
character_sets_dir C:\xampp\mysql\share\charsets\
collation_connection utf8mb4_unicode_ci
collation_database utf8mb4_unicode_ci
collation_server utf8mb4_unicode_ci
completion_type NO_CHAIN
concurrent_insert AUTO
connect_timeout 10
core_file OFF

简而言之,我接受 web-api 的输入并使用 uft8_encode() 对其进行编码。然后我将它插入到数据库中。问题是一些字符没有很好地编码,当我从数据库中调用它们时,它们都被窃听了。

示例 1:

1.输入 -> Перуанский чертовски

2.编码 -> ÐеÑÑанÑкий ÑеÑÑовÑки

3.插入数据库

4.从数据库中选择 -> Ð?еÑ?Ñ?анÑкий Ñ?еÑ?Ñ?овÑкÐ

5.解码

6.输出 -> ??е???анский ??е???овск�

示例 2:

1.输入 -> $ |/| 1 ↓_ € ♥ J

2.编码 -> $ |/| 1 â_ ⥠J

3.插入数据库

4.Select from DB -> 1 â??_ â?¬ â?¥ J

5.解码

6.输出 -> 1 ???_ ????? J

【问题讨论】:

  • 除非您的应用符合 ISO-8859-1,否则无需对字符串进行编码/解码,但看起来并非如此。
  • 好吧,如果我不编码和解码他们在数据库中完全被窃听的字符串。在第一个示例中,如果我不对其进行编码,结果是????????? ?????
  • 我很确定问题出在其他地方。你的网页字符集是什么?
  • 你的意思是html?因为我没有从用户输入中获取名称。我直接从 steamapi 以 JSON 格式获取它们。
  • @holyknight 试试这两行代码:ini_set("default_charset", "UTF-8");header('Content-type: text/html; charset=UTF-8');

标签: php mysql utf-8 steam-web-api utf8mb4


【解决方案1】:

字符/字符集/排序规则问题清单

包括mysqlmysqliPDO


内容

  1. 免责声明
  2. 我的数据库中的插入不能正常工作!我能做什么?
  3. 更改数据库或表的字符集和排序规则
  4. 设置脚本文件的编码
  5. 使用 php 或 meta 标签设置页面的字符集
  6. UTF8 和 UTF8mb4 有什么区别?
  7. 回答这个特定的问题
  8. 更多信息/附加链接
  9. 旁注


1。免责声明

这个答案不仅应该回答这个问题,而且答案应该更广泛一些,以便更多人更快地找到捆绑好的答案!

!重要通知!
如果您更改数据库中的某些内容,请始终确保您拥有数据库的备份!检查 2 次,或 3 次!

我愿意接受改进和 cmets,例如纠错。
另外,如果语法不完美,我深表歉意:D


如果你遇到这样的问题:

  • Php + Mysql (UTF-8, utf8mb4) 一些字符仍然是错误
  • 如何将整个 MySQL 数据库字符集和排序规则转换为 UTF-8?
  • 尝试将 UTF-8 插入 MySQL 时出现“错误的字符串值”
  • 在 my.cnf 中将 MySQL 默认字符集更改为 UTF-8?
  • 在 php 和 mysql 中使用 utf8mb4
  • PDO + MySQL 和损坏的 UTF-8 编码
  • 在 php Mysql 中插入数据出错
  • PHP PDO:字符集,设置名称?
  • 在 MySQL 中设置名称 utf8?
  • PHP mysql charset utf8 问题
  • 一直到UTF-8
  • 用 PHP 处理 MySQL 中的 utf8mb4 数据
  • ERROR 1115 (42000) : Unknown character set: 'utf8mb4' in mysql

...那我的回答或许对你有帮助!


2。我的数据库中的插入无法正常工作!我能做什么?

如果您的插入无法正常工作,并且您插入的数据在您的数据库中看起来像这样,那么这可能有多种原因!

例子:

??????????
????
�??_ �?�
â_ ⬠⥠J

这里有一个小清单,您可以仔细检查一下是否一切正常!
(在清单之后有一些关于mysqlmysqliPDO 的额外信息)


清单:

  • 确保在表、客户端、服务器和文本字段上设置了默认字符集
    • 如果没有看到第 3 点
  • 确保您的数据库连接字符集
    • 如果没有看到点 mysql/PDO
  • 确保您的显示数据设置了文档的字符集!
    • 如果没有看到第 5 点
  • 确保您的脚本文件以正确的字符集保存!
    • 如果没有看到第 4 点
  • 确保设置好角色和字符集!
    • 如果没有看到点 mysql/PDO
  • 确保您的表单接受 utf8!
    • 如果没有看到第 5 点
  • 确保您已设置连接编码
    • 如果没有看到点 mysql/pdo
  • 确保您已正确设置服务器字符编码
    • 如果没有看到点 mysql/pdo
  • ...

  • 您必须确保在任何地方都使用 utf8/utf8mb4!


mysql:

-mysql_query("SET NAMES 'utf8'"); 在您使用的每个查询之前运行 SET NAMES。因为如果 mysql 驱动程序没有为字符集提供机制,那么您必须使用 SET NAMES!
-mysql_query("SET CHARACTER SET utf8 "); 设置字符为 utf8
-mysql_set_charset('utf8'); 将您的字符集设置为 utf8
-mysql API 驱动不支持 utf8mb4 (ERROR 1115 (42000))
-character_set_server=utf8 设置服务器字符

PDO:

-$dbh->exec("set names utf8"); 如果您使用 PDO,您可以使用此行来设置名称
-$dbh = new PDO("mysql:host=$host;dbname=$db;charset=utf8"); 此行设置字符集,但您必须拥有 PHP 5.3.6 或更高版本
-$dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "); 你也可以用这一行设置 SET NAMES
-mb_internal_encoding('UTF-8'); 设置使用 PDO 时的编码


3。更改数据库或表的字符集和排序规则

如果您必须更改数据库或表的字符集或排序规则,您可以使用以下代码行:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;


4。设置脚本文件的编码

您可能需要检查您的 skript(php) 文件是否使用正确的字符集保存!

为此,我会推荐你​​Notpad++

如果您在记事本中打开文件,请转到菜单点“编码”并更改字符集


5。使用 php 或 meta 标签设置页面的字符集

要以 utf8/utf8mb4 格式显示数据,您必须确保您的网站设置了正确的字符集!

您可以通过 3 种方式设置字符集,如下所示:

//PHP
ini_set("default_charset", "UTF-8");
header('Content-type: text/html; charset=UTF-8');

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

还接受 utf8 在您的表单中使用:

<form accept-charset="UTF-8">


6。 UTF8 和 UTF8mb4 有什么区别?

UTF8:
-utf8 只支持 3 个字节的符号
-...(更多)

UTF8MB4:
-utf8mb3 支持 4 字节的符号
-...(更多)


7。回答这个特定的问题

我认为这应该可以工作,因为您使用了PDO
(创建 PDO 对象后!如果您使用的 PHP 版本低于 5.3.6)

$dbh->exec("set names utf8");

否则请尝试以下方法之一:

ini_set("default_charset", "UTF-8");
header('Content-type: text/html; charset=UTF-8');

更新:

要更改databasetablecollationcharset,请使用:

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


8。更多信息/附加链接


9。旁注

9.1 错误报告
如果没有显示错误,请使用此代码 sn-p:

<?php
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
?>

9.2 Unicode
为了不犯任何错误,你必须真正了解 utf8!

9.3 mysql、mysqli、PDO 一字之差
我的个人排名是:

  1. PDO
  2. mysqli
  3. mysql

我建议你使用 PDO 或 mysqli,因为它们对 mysql 有很多好处!

【讨论】:

    【解决方案2】:

    我从 SQLyog 更改了表的排序规则,但它似乎已损坏。当我直接从 sql 查询更改它们时,它起作用了。

    【讨论】:

      猜你喜欢
      • 2012-03-11
      • 2014-01-27
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2018-09-07
      • 2012-03-11
      • 2011-02-26
      • 2013-07-07
      相关资源
      最近更新 更多