在数据库中保存表情符号时出现奇怪的字符。这是正常的吗?

Posted

技术标签:

【中文标题】在数据库中保存表情符号时出现奇怪的字符。这是正常的吗?【英文标题】:Strange characters when saving emoji in the database. Is this normal? 【发布时间】:2019-07-12 08:20:30 【问题描述】:

表情符号保存在我的数据库 (phpmyadmin) 中,例如 😋😉😎😀😃(通过表单输入)。对我来说,这似乎很奇怪,还是这是正常的?它们以正确的方式显示在我的网站上。所以,没有真正的问题,但我想确保这些奇怪的字符是正确的。我的表格和文本字段具有字符集 utf8mb4_general_ci,并且我在 html 页面上使用 <meta charset=utf-8>

更新

我进行了进一步的研究,但我还没有找到解决方案。 mojibake 已成为问号。这些表情符号现在让我哭了……希望有人知道我做错了什么。

我尝试将所有内容都转换为 utf8mb4 和 utf8mb4_unicode_ci(服务器、数据库、表和列)。

我什至在 my.cnf 中设置:

[client]

default-character-set = utf8mb4

[mysql]

default-character-set = utf8mb4

[mysqld]

character-set-client-handshake = FALSE

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

如果我查看全局变量,输出看起来不错:

但是,如果我查看变量,则会发生以下情况:

我也看了问答:

问号(Señor for Señor):

    要存储的字节未编码为 utf8 / utf8mb4。解决这个问题。 我该如何解决这个问题? 数据库中的列不是 CHARACTER SET utf8(或 utf8mb4)。解决这个问题。 (使用 SHOW CREATE TABLE。)。 该列具有正确的字符集 (utf8mb4)。 另外,请检查连接是否为 UTF-8。 我如何检查这个?

我的测试表格是这样的:

<?php

header('Content-Type: text/html; charset=utf-8');

$con = mysqli_connect('*','*','*','*') or exit();

mysqli_set_charset($con, "utf8mb4"); /// without this, it become latin1

///mysqli_query($con, "SET character_set_results = 'utf8mb4', character_set_client = 'utf8mb4', character_set_connection = 'utf8mb4', character_set_database = 'utf8mb4', character_set_server = 'utf8mb4'");


include ($_SERVER['DOCUMENT_ROOT'].'/assets/errors_and_warnings.php');

echo mysqli_character_set_name($con);

echo $_POST['action'];

if (!empty($_POST['bericht'])) 
    
    $bericht = $_POST['bericht'];
    
 else 
    
    $bericht = 'leeg';


echo $bericht;

if (isset($_POST['action'])) 

mysqli_query($con, "INSERT INTO test (bericht, datum)
                         VALUES ('".mysqli_real_escape_string($con, $bericht)."',
                                 NOW())")
            or exit (mysqli_error($con));


?>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Formulier</title>
</head>

<body>
    
<br><br>
    
    <form accept-charset="UTF-8" action="<?php $_SERVER['REQUEST_URI'] ?>" method="post" name="test" id="test">

      <input name="action" type="hidden" id="action" value="topicplaatsen" />
        
        Bericht:<br />
        
        <textarea name="bericht" cols="40" rows="10" id="bericht">Proeftekst</textarea><br><br>
    
    <input name="imageField" type="image" src="../vormgeving/2010/button/verstuur_blauw.gif"/>
    
    </form>
    
</body>
    
</html>

我使用的是 mysql 版本 5.5.60。

【问题讨论】:

UTF-8 all the way through的可能重复 【参考方案1】:

😋😉😎😀😃????? 的 Mojibake。

这通常意味着latin1 参与了处理的某个地方。对于 Emoji,您需要 CHARACTER SET utf8mb4只是旧的 utf8

This Q&A 应该可以帮助您找出缺少的步骤。

它说的一个(几件事):HTML 表单应该像 &lt;form accept-charset="UTF-8"&gt; 一样开始

更多

GLOBAL VARIABLES 看起来正确; SESSION VARIABLES 似乎没有获取全局值某些东西正在覆盖它们。

您是否重新连接失败?

您可以在连接之后和执行各种其他查询之前添加$con-&gt;set_charset('utf8mb4');

每次使用$con 后检查错误。

【讨论】:

谢谢!我尝试了一些东西。我已经更新了我的问题。 好吧,我也添加了一些东西。

以上是关于在数据库中保存表情符号时出现奇怪的字符。这是正常的吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥表情符号字符像????‍????‍??????‍????在 Swift 字符串中被如此奇怪地对待?

表情符号的 Python unicode 字符转换

我们如何将表情符号保存在 SQL 数据库中以保留它们的唯一性以进行相等比较?

使用 Spring 应用程序中的休眠将表情符号 unicode 字符保存在 mysql 数据库中

表情符号未使用 mysql 和 node 保存在数据库中

提交到 iTunes Connect 时出现奇怪的错误