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

时间:2019-02-18 21:53:24

标签: mysql utf-8 utf8mb4

Emoji像😋😉😎😀😃(通过表格输入)一样保存在我的数据库(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

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

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

我还查看了问答:

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

  1. 要存储的字节未编码为utf8 / utf8mb4。解决这个问题。 我该如何解决?
  2. 数据库中的列不是CHARACTER SET utf8(或utf8mb4)。解决这个问题。 (使用显示创建表。)。 该列具有正确的字符集(utf8mb4)。
  3. 此外,检查连接是否为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版本。

1 个答案:

答案 0 :(得分:0)

appendOwner😋😉😎😀😃的Mojibake。

这通常意味着参与了处理。对于表情符号,您需要latin1,而不仅仅是旧的CHARACTER SET utf8mb4

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

它说了几句话:HTML表单应以utf8

开头

更多

<form accept-charset="UTF-8">看起来正确; GLOBAL VARIABLES似乎没有接受全局值覆盖了它们。

  • 您是否无法重新连接?

  • 您可以在连接之后和执行其他各种查询之前添加SESSION VARIABLES

  • 每次使用$con->set_charset('utf8mb4');后检查错误。