首页 > 解决方案 > 在数据库中保存表情符号时出现奇怪的字符。这是正常的吗?

问题描述

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

更新

我进行了进一步的研究,但我还没有找到解决方案。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 代表 Señor):

  1. 要存储的字节未编码为 utf8 / utf8mb4。解决这个问题。我怎样才能解决这个问题?
  2. 数据库中的列不是 CHARACTER SET utf8(或 utf8mb4)。解决这个问题。(使用 SHOW CREATE TABLE。)。该列具有正确的字符集 (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。

标签: mysqlutf-8utf8mb4

解决方案


😋😉😎😀😃是 Mojibake 的

它通常意味着latin1在处理的某个地方涉及。对于 Emoji,您需要CHARACTER SET utf8mb4不仅仅是旧的utf8.

此问答应该可以帮助您找出缺少的步骤。

它说的一件(几件)事情:HTML表单应该像这样开始<form accept-charset="UTF-8">

更多的

GLOBAL VARIABLES外观正确;SESSION VARIABLES似乎没有接受全球价值观或某些东西正在压倒它们。

  • 重新连接失败了吗?

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

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


推荐阅读