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

时间:2014-11-07 20:10:27

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

我有一个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.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.Output - > 1 ?? _ ? ? J

2 个答案:

答案 0 :(得分:10)

字符/字符集/校对问题的核对表

包括mysqlmysqliPDO


内容

  1. 声明
  2. 我的数据库中的插入内容无法正常工作!我该怎么办?
  3. 更改数据库或表的字符集和整理
  4. 设置skript文件的编码
  5. 使用php或meta tag设置页面的字符集
  6. UTF8与UTF8mb4的区别是什么?
  7. 回答此具体问题
  8. 更多信息/其他链接
  9. 附注>

  10. 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:charset,set names?
    • 在MySQL中设置名称utf8?
    • PHP mysql charset utf8问题
    • UTF-8一直到
    • 使用PHP操作MySQL的utf8mb4数据
    • ERROR 1115(42000):未知字符集:' utf8mb4'在mysql中

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


    2。我在我的数据库中插入的内容无法正常工作!我该怎么办?

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

    示例:

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

    这是一个小清单,你可以去检查一下它是否应该如何!
    (在核对表之后,mysqlmysqliPDO有一些额外的信息


    <强>清单:

    • 确保在表格,客户端,服务器和设备上设置默认字符集。文本字段
      • 如果不是,请参阅第3点
    • 确保您的数据库连接字符集
      • 如果没有,请参阅Point mysql / PDO
    • 确保显示数据是否已设置文档的字符集!
      • 如果没有,请参阅第5点
    • 确保使用正确的字符集保存您的skript文件!
      • 如果没有,请参阅第4点
    • 确保你设置你的角色和你的字符集!
      • 如果没有,请参阅Point mysql / PDO
    • 确保您的表格接受utf8!
      • 如果没有,请参阅第5点
    • 确保已设置连接编码
      • 如果没有,请参阅Point mysql / pdo
    • 确保已将servercharacter编码设置为正确
      • 如果没有,请参阅Point 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。更改数据库或表的字符集和整理

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

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


    4。设置skript文件的编码

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

    为此,我建议您Notpad++

    如果您在notpad中打开了文件,请转到menupoint&#39;编码&#39;并改变charset


    5。使用php或meta标签

    设置页面的字符集

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

    您可以通过以下三种方式设置字符集:

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

    更新:

    要更改collationcharset的{​​{1}}或database,请使用此代码:

    table


    8。更多信息/其他链接


    9。附注

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

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

    9.2 Unicode
    这样你就不会犯任何错误,你必须真正了解utf8!

    9.3一句话给mysql,mysqli和PDO
    我的个人排名是:

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

答案 1 :(得分:0)

我从SQLyog更改了表的排序规则,但它似乎已经破了。当我直接从SQL查询中更改它时,它可以工作。