3

好吧,我得到了一个 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.输出 -> �?е�?�?анский �?е�?�?овск�</p>

示例 2:

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

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

3.插入数据库

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

5.解码

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

4

2 回答 2

13

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

包括mysql, mysqli,PDO


内容

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


1. 免责声明

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

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

我愿意接受改进和评论,例如错误更正。
另外,如果语法不完美,我深表歉意:D


如果您遇到这样的问题:

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

...那么我的回答可能对您有所帮助!


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');

更新:

要改变collationorcharsetdatabaseortable使用这个:

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 错误报告
如果没有显示错误,请使用以下代码片段:

<?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 有很多好处!

于 2014-11-07T20:42:02.357 回答
0

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

于 2014-11-07T21:53:04.500 回答