Странные символы при сохранении эмодзи в базе данных.Это нормально? - PullRequest
0 голосов
/ 19 февраля 2019

Emoji сохраняются в моей базе данных (phpmyadmin) как 😋😉😎😀😃 (ввод через форму).Мне кажутся странными персонажи или это нормально?Они отображаются на моем сайте в правильном направлении.Итак, нет реальной проблемы, но я хочу убедиться, что эти странные персонажи правы.В моей таблице и текстовых полях есть наборы символов utf8mb4_general_ci, и я использую <meta charset=utf-8> на html-странице.

Обновление

Я продолжил исследования, но пока не нашел решения.Моджибаке стали вопросительными знаками.Эти эмодзи теперь заставляют меня плакать ... надеюсь, кто-то знает, что я делаю неправильно.

Я пытался преобразовать все в 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).Почини это.(Используйте 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.

1 Ответ

0 голосов
/ 19 февраля 2019

😋😉😎😀😃 - это моджибаке для ?????.

Обычно это означает, что latin1 был задействован где-то в процессе обработки.Для Emoji вам нужно CHARACTER SET utf8mb4, , а не только старый utf8.

Эти вопросы и ответы должны помочь вам понять, на каком этапеотсутствует.

Одна (из нескольких) вещей, которые он говорит: HTML-формы должны начинаться как <form accept-charset="UTF-8">

Подробнее

Внешний вид GLOBAL VARIABLESправильный;SESSION VARIABLES, кажется, не подобрал глобальные значения или , что-то переопределяет их.

  • Не удалось восстановить соединение?

  • Вы можете добавить $con->set_charset('utf8mb4'); после подключения и перед выполнением различных других запросов.

  • Проверять ошибки после каждого использования $con.

...