表情符号插入数据库php后显示为问号

问题描述 投票:0回答:4

我使用utf8mb4作为编码,character_set_connection和character_set_database已设置为utf8mb4。我的网页的字符集设置为utf8。我使用了 PDO,当我打开数据库连接时,我使用 utf8mb4 作为字符集。表中的列也有 utf8mb4_unicode_ci 作为排序规则。使用的存储引擎是MyISAM。

出现差异是因为我无法编辑character_set_server(因为我在共享主机上),它默认设置为utf8,而collation_server默认设置为utf8_unicode_ui。我无法以任何方式改变这些。它在具有类似字符变量的本地主机上运行良好。

连接变量是$conn,打开方式为

$db_server = 'localhost'; $db_name = 'userdb'; $db_encoding = 'utf8mb4'; $db_user = 'test'; $db_pass = 'password'; $conn = new PDO('mysql:host='.$db_server.';dbname='.$db_name.';charset='.$db_encoding,$db_user,$db_pass);

接受输入的形式很简单
<form action="" method="POST" accept-charset="UTF-8"><input type="text" class="form-control" name="inp"></form>

输入被处理为
$test = $_POST['inp']; $it = $conn->prepare("INSERT INTO tbl_test(message) VALUES(?)"); $it->bindParam(1,$test,PDO::PARAM_STR); if($it->execute()) echo $test; else echo 'Error!';

所以问题是:

  1. 为什么即使我尽可能使用了 utf8mb4 和 utf8mb4_unicode_ci 还是会出现问题?
    2.这可能是一个 php 问题,而不是一个 MySQL 问题,因为问题发生在数据库插入期间(我对字符串使用了 stripslashes()、trim() 和 htmlspecialchars() 函数)?
    3.有趣的是,表情符号(unicode 字符)在网站的聊天页面上运行得很好。会不会是因为加密的原因?似乎没有可能的解释!

由于我使用共享主机,因此无法编辑 MySQL 配置文件。

php mysql unicode utf-8 utf8mb4
4个回答
15
投票

在字符变量和mysql配置上浪费了大量时间之后,我用一个简单的解决方案解决了这个问题,那就是

base64_encode

通过
base64_encode
传递输入字符串,然后使用
base64_decode
来显示它们在这种情况下是有效的。然而,字符串比以前占用了更多的空间,但这个解决方案非常简单且值得。
我刚刚发布这个问题是为了知道是否有人遇到过类似的问题,但人们确实不明白这个问题的要点。这就是SO上的人真正疲惫的地方。无论如何,感谢您的帮助! :)


1
投票

有很多东西需要声明

utf8mb4
——列、连接、表单等等。乍一看,看起来你已经做了所有这些。

请参阅此了解导致“问号”的原因:UTF-8 字符出现问题;我看到的不是我存储的

您谈到了 2 个

character_set
变量,但没有讨论所需的 3 个:

| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_results    | utf8mb4                    |

看看你的 php.ini 是否有

default_charset UTF-8

不要使用任何形式的编码/解码,它只是避免解决问题。

请向我们展示

echo bin2hex($text);
一些表情符号。


0
投票

我已将 PDO 数据库连接的字符集更改为

utf8mb4
,并将整个数据库排序规则更改为
utf8mb4_general_ci
,表情符号终于起作用了!


0
投票

我已将 PDO 数据库连接的字符集更改为 utf8mb4,并将 wchole 数据库排序规则更改为 utf8mb4_general_ci,表情符号终于起作用了!

这才是真正的答案

© www.soinside.com 2019 - 2024. All rights reserved.