我有一个PHP脚本,它从Steam web-api获取昵称并将它们插入到mysql数据库中。他们中的许多人都有罕见的俄罗斯和希腊人物。我在php.ini和所有带有
的php文件中将php设置为utf-8mb_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
答案 0 :(得分:10)
mysql
,mysqli
,PDO
这个答案不仅应该回答这个问题,而且答案应该更广泛一些,所以更多的人找到更快的捆绑和良好的答案!
!重要通知!
如果您在数据库中更改某些内容,请始终使用数据库备份!检查2次,或3次!
我愿意接受改进和评论,例如错误更正。
另外,如果语法不完美我会道歉:D
如果你遇到这样的问题:
...那么我的回答可能对你有帮助!
如果您的插入内容无法正常工作,您插入的数据在数据库中看起来就像这样,那么这可能有多种原因!
示例:
??????????
�??_ �?�
â_ ⬠⥠J
这是一个小清单,你可以去检查一下它是否应该如何!
(在核对表之后,mysql
,mysqli
和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时设置编码
如果必须更改数据库或表的字符集或排序规则,可以使用以下代码行:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
您可能需要检查您的skript(php)文件是否使用正确的字符集保存!
为此,我建议您Notpad++!
如果您在notpad中打开了文件,请转到menupoint&#39;编码&#39;并改变charset
要在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">
UTF8:
-utf8仅支持3个字节的符号
-...(更多)
UTF8MB4:
-utf8mb3支持4字节的符号
-...(更多)
我认为这应该有效,因为您使用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');
更新:
要更改collation
或charset
的{{1}}或database
,请使用此代码:
table
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
我的个人排名是:
我建议你使用PDO或mysqli,因为它对mysql有很多好处!
答案 1 :(得分:0)
我从SQLyog更改了表的排序规则,但它似乎已经破了。当我直接从SQL查询中更改它时,它可以工作。