Php + Mysql(UTF-8)的一些字符仍然是bug

hol*_*ght 3 php mysql utf-8 steam-web-api utf8mb4

好吧,我有一个PHP脚本,从Steam web-api获取昵称,并将它们插入到mysql数据库中.他们中的许多人都有罕见的俄罗斯和希腊人物.我在php.ini和所有的php文件中将php设置为utf-8

mb_internal_encoding('utf-8');
Run Code Online (Sandbox Code Playgroud)

我的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'");
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

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

例1:

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

2.Encode - >ÐÐμÑÑанÑкийÑÐμÑÑовÑки

3.插入DB

4.从DB中选择 - >Ð?ÐμÑ?Ñ?анÑкийÑ?ÐμÑ?Ñ?овÑкÐ

5.Decode

6.Output - > ?е ? ?анский ? ? ?овск

例2:

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

2.Encode - > $ |/| 1,J

3.插入DB

4.从DB中选择 - > 1 ?? ?? ?? J

5.Decode

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

Riz*_*123 12

字符/字符集/整理问题的清单

其中包括mysql,mysqli,PDO


内容

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


1.免责声明

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

!重要的提醒!
如果您在数据库中更改某些内容,请始终保留数据库的备份!检查2次,或3次!

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


如果你遇到这样的问题:

  • Php + Mysql(UTF-8,utf8mb4)一些字符仍然是bug
  • 如何将整个MySQL数据库characterset和collat​​ion转换为UTF-8?
  • 尝试将UTF-8插入MySQL时,"字符串值不正确"
  • 在my.cnf中将MySQL默认字符集更改为UTF-8?
  • 使用utf8mb4与PHP和MySQL
  • PDO + MySQL和破坏的UTF-8编码
  • 在php Mysql中插入数据时出错
  • PHP PDO:charset,设置名称?
  • 在MySQL中设置名称utf8?
  • PHP mysql charset utf8问题
  • UTF-8一路走来
  • 使用PHP操纵MySQL的utf8mb4数据
  • 错误1115(42000):未知字符集:mysql中的'utf8mb4'

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


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

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

例子:

??????????

???_ ???
â_ ⬠⥠J
Run Code Online (Sandbox Code Playgroud)

这是一个你可以去的小清单,检查一切是否应该如何!
(在清单之后有一些额外的信息mysql,mysqliPDO)


清单:

  • 确保在表,客户端,服务器和文本字段上设置默认字符集
    • 如果不是,请参见第3点
  • 确保数据库连接字符集
    • 如果没有看到点mysql/PDO
  • 确保显示数据是否已设置文档的字符集!
    • 如果没有,请参见第5点
  • 确保使用正确的字符集保存您的skript文件!
    • 如果没有,请参见第4点
  • 确保你设置你的角色和你的字符集!
    • 如果没有看到点mysql/PDO
  • 确保你的表格接受utf8!
    • 如果没有,请参见第5点
  • 确保已设置连接编码
    • 如果没有,请参阅点mysql/pdo
  • 确保已将servercharacter编码设置为正确
    • 如果没有,请参阅点mysql/pdo
  • ...

  • 你必须确保你到处都使用utf8/utf8mb4!


MySQL的:

- mysql_query("SET NAMES 'utf8'");在使用每个查询之前运行SET NAMES.因为如果一个mysql驱动程序没有为charset提供机制,那么你必须使用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.更改数据库或表的Charset和Collat​​ion

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

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)


4.设置skript文件的编码

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

为此我会推荐你Notpad ++!

如果您在notpad中打开了文件,请转到menupoint'编码'并更改字符集


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

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

你可以用3种方式设置charset:

//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" />
Run Code Online (Sandbox Code Playgroud)

也可以在表单中使用utf8:

<form accept-charset="UTF-8">
Run Code Online (Sandbox Code Playgroud)


6. UTF8和UTF8mb4有什么区别?

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

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


7.回答这个具体问题

我认为这应该适用于你使用PDO:(
创建PDO对象之后!如果你使用的PHP版本低于5.3.6)

$dbh->exec("set names utf8");
Run Code Online (Sandbox Code Playgroud)

否则尝试其中一个:

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

更新:

要改变collationcharset一个databasetable使用此:

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Run Code Online (Sandbox Code Playgroud)


8.进一步的信息/补充链接


9.附注

9.1错误报告
如果未显示错误,请使用以下代码段:

<?php
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
?>
Run Code Online (Sandbox Code Playgroud)

9.2 Unicode
所以你不要犯任何错误你必须真正理解utf8!

9.3 mysql,mysqli和PDO的一个词
我的个人排名是:

  1. PDO
  2. mysqli的
  3. MySQL的

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