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这个答案不仅应该回答这个问题,而且答案应该更广泛一些,所以更多的人找到更快的捆绑和良好的答案!
!重要的提醒!
如果您在数据库中更改某些内容,请始终保留数据库的备份!检查2次,或3次!
我愿意接受改进和评论,例如错误更正.
另外,如果语法不完美我会道歉:D
如果你遇到这样的问题:
...那么我的回答可能对你有所帮助!
如果您的插入不能正常工作,您插入的数据在数据库中看起来像这样,那么这可能有多种原因!
例子:
??????????
???_ ???
â_ ⬠⥠J
Run Code Online (Sandbox Code Playgroud)
这是一个你可以去的小清单,检查一切是否应该如何!
(在清单之后有一些额外的信息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;
Run Code Online (Sandbox Code Playgroud)
您可能必须检查您的skript(php)文件是否使用正确的字符集保存!
为此我会推荐你Notpad ++!
如果您在notpad中打开了文件,请转到menupoint'编码'并更改字符集
要在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)
UTF8:
-utf8仅支持3个字节的符号
-...(更多)
UTF8MB4:
-utf8mb3支持4字节符号
-...(更多)
我认为这应该适用于你使用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)
更新:
要改变collation或charset一个database或table使用此:
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)
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的一个词
我的个人排名是:
我建议你使用PDO或mysqli,因为它对mysql有很多好处!
| 归档时间: |
|
| 查看次数: |
9047 次 |
| 最近记录: |