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

时间:2018-10-14 15:44:08

标签: php mysql unicode utf-8 utf8mb4

我知道这个问题已经被问过很多次了,我几乎尝试了所有方法,但是情况有所不同,所以请继续阅读!不要投票!正如我说的,我已经尝试了大多数解决方案!

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

之所以会出现差异,是因为我无法编辑character_set_server(因为我位于共享主机上),因此默认情况下将其设置为utf8,默认情况下将collat​​ion_server设置为utf8_unicode_ui。我不能以任何方式改变这些。在具有类似字符变量的localhost上运行良好。

修改:
连接变量是$ 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字符)在网站的一个页面(即聊天页面)上可以很好地工作。难道是由于加密?似乎没有可能的解释!

在回答之前,请记住我已经在SO上尝试了几乎所有解决方案,并且由于我位于共享主机上,因此我无法编辑MySQL配置文件。 请回答,我被坚持超过3天了!

2 个答案:

答案 0 :(得分:1)

在用字符变量和mysql配置浪费大量时间后,我用一个简单的解决方案base64_encode解决了这个问题。
通过base64_encode传递输入字符串,然后使用base64_decode来显示输入字符串在这种情况下可以正常工作。但是,字符串比以前占用了更多的空间,但是此解决方案确实非常简单而且值得。 我刚刚发布了这个问题,以了解是否有人遇到过类似的问题,但是人们确实没有理解该问题的重点。那就是SO员工真正精疲力尽的地方。无论如何,谢谢您的帮助! :)

答案 1 :(得分:0)

utf8mb4中需要声明多个内容-列,连接,表单等。看起来,您似乎都做了所有这些事情。

查看引起“问号”的原因:Trouble with UTF-8 characters; what I see is not what I stored

您谈到了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);以获得一些表情符号。