Миграция базы данных Laravel из старой базы данных UTF-8 проблема с кодировкой - PullRequest
0 голосов
/ 06 февраля 2019

Proclaimer: ДА, я выполнил поиск в Stackoverflow, и НЕТ, он не смог найти ответ для этого случая.

Я переношу данные с форума, который имеет какое-то наследие в своей базе данных MySQL.,Одной из проблем является хранение Emoji.

База данных доноров:

-- Server: 5.5.41-MariaDB
CREATE TABLE `forumtopicresponse` (
  `id` int(10) UNSIGNED NOT NULL,
  `topicid` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `userid` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `message` text NOT NULL,
  `created` int(10) UNSIGNED NOT NULL DEFAULT '0',
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

В столбце сообщения у меня есть такое сообщение: Success!ðŸ‘ðŸ‘, который отображается как «Success! ??»

Целевая база данных Laravel:

-- Server: MySQL 5.7.x
CREATE TABLE `answers` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `topic_id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `body` text CHARACTER SET utf8mb4,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  ...keys & indexes
) ENGINE=InnoDB AUTO_INCREMENT=1254419 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

В HTML документ имеет <meta charset="utf-8"> и для отображения поля,Я использую

{!! nl2br(e($answer->body)) !!}

И с этим он просто отображается как Success!ðŸ‘ðŸ‘, а не эмодзи.

Вопрос

Как я могу перенести эти данные CLEAN и UTF-8 в мою новую базу данных?Я думаю, что мне нужна некоторая UTF-кодировка, но я не могу понять, какая именно.

ОБНОВЛЕНИЕ!РЕШЕНИЕ

Исправлено.Единственное решение состояло в том, чтобы изменить таблицу в базе данных доноров.

ALTER TABLE forumtopicresponse CHANGE message message LONGTEXT CHARACTER SET latin1;
ALTER TABLE forumtopicresponse CHANGE message message LONGBLOB;

НЕ меняйте LONGBLOB на LONGTEXT: я потерял данные таким способом.

Когда я переносил данные LONGBLOB вв целевой базе данных Laravel все переносится корректно: все специальные символы и смайлики исправлены в UTF-8.

1 Ответ

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

Emoji ? является шестнадцатеричным F09F918D.Таким образом, это 4-байтовая строка.

MySQL CHARACTER SET = utf8 не обрабатывает 4-байтовые строки UTF-8, а только 3-байтовые, исключая тем самым многие эмодзи и некоторые китайские.

Когда интерпретируется как latin1, эти шестнадцатеричные цифры равны 👠(плюс 4-й, но непечатаемый символ).Отображение подобной тарабарщины называется «Мохибаке».

Итак, у вас есть 2 проблемы:

  • Необходимо изменить хранилище на utf8mb4, чтобы вы могли хранить Emoji.
  • Необходимо объявить MySQL, что ваш клиент говорит на UTF-8, а не на латыни 1.

См. "Best Practice" в Проблема с символами UTF-8;то, что я вижу, не то, что я сохранил

И также вижу UTF-8 на всем пути до

Вот мой список исправлений, но сначала вы должны правильно определить, какой у вас случай.Применение неправильного исправления ухудшает ситуацию.

Может быть третья ошибка - при перемещении данных с 5,5 до 5,7.Пожалуйста, предоставьте эти детали.

...