Рейтинг:1

Обновление Ubuntu 20.04.2 MySQL исказило наши данные... как исправить?

флаг mx

Мы обновили Ubuntu Server 18.04.5 LTS до Ubuntu Server 20.04.2 LTS. Все было хорошо, пока сегодня мы не заметили, что одно из наших приложений больше не работает. MySQL, похоже, исказил символы Unicode (хранящиеся как UTF-8) в базе данных, когда программное обеспечение базы данных было обновлено.

Например, символ UTF-8:

0xF0 0x9F 0x8C 0xB5

Стал:

0xC3 0xB0 0xC5 0xB8 0xC5 0x92 0xC2 0xB5

Похоже, что-то во время обновления дважды закодировало данные как UTF-8, хотя данные были уже действительный UTF-8.

Набор символов в таблице до обновления был «utf8». Теперь набор символов таблицы — «utf8mb3».

Не знаю, что здесь делать, чтобы решить проблему.

флаг in
Проблема с приложением Django?
флаг mx
Нет. Также не уверен, почему кто-то отрицает это. Голоса против только за то, что «не показаны какие-либо исследования или усилия, неясные или бесполезные». Ничто из этого не применимо. Я провел исследование, и лучшее, что я нашел, это: https://stackoverflow.com/questions/11436594/how-to-fix-double-encoded-utf8-characters-in-an-utf-8-table Но один SQL-запрос далек от фактического решения. Обновление до Ubuntu обновило MySQL до версии 8.0 и изменило таблицы и данные в них таким образом, что они не работают.
флаг in
Причина, по которой я спросил об использовании Django, заключается в том, что некоторые системы, такие как эта, имеют очень особые ожидания от механизма БД на основе конфигураций подключения. Вы сказали, что это происходит с *одной* системой, а не со всеми, поэтому предполагалось, что жесткое приложение нуждается в обновлении. UTF8 (в MySQL 5.x и ниже) устарел в пользу Utf8mb4, но для преобразования устаревших таблиц базы данных в текущий набор символов требуется перестройка таблицы. Поскольку вопрос стоит, недостаточно подробностей, чтобы предложить какие-либо конкретные предложения.
флаг mx
Это почти наверняка не ограничивается одним приложением. Пока мы заметили, что это единственное приложение, которое склонно использовать Unicode (в частности, смайлики). Данные сериализуются в базе данных (что мы делаем МНОГО), а десериализатор отказывается от данных, потому что MySQL возвращает символы UTF-8 с двойной кодировкой. Использование самого клиента MySQL показывает, что данные закодированы дважды (т.е. это не проблема с приложением).
флаг mx
Дело в том, что любой, кто запускает MySQL в Ubuntu Server LTS 18.04 и обновляется до 20.04 и имеет таблицы в своей базе данных с кодировкой «utf8», столкнется с той же проблемой. Поэтому полностью актуален и полезен и нуждается в рабочем исправлении.
флаг mx
Хорошо, после нескольких часов борьбы с этим у меня есть ЧАСТИЧНОЕ решение: сначала преобразовать набор символов таблицы в `utf8mb4` с помощью `ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4`. Затем для каждого затронутого столбца используйте SQL-запрос из публикации SO, чтобы изменить данные в столбце. Сделайте все это сначала в отдельном клонированном наборе таблиц базы данных, чтобы случайно не ухудшить ситуацию. Но, как я уже сказал, это частичное, предварительное решение, которое *похоже* делает данные достоверными, но оно далеко от ответа. Мне нужно создать инструмент, чтобы определить, насколько широко распространена проблема.
флаг mx
Ладно, спустя НАМНОГО больше времени я обработал все наши данные. Вышеупомянутый метод работает, вроде. Я *настоятельно* рекомендую экспортировать ваши данные, используя соединение `utf8`, выполнить обновление MySQL, изменить только поля с символами Unicode, а затем восстановить поврежденные данные из экспортированных данных (т. е. ваш экспорт правильный, MySQL иногда делает это неправильно). Потому что https://stackoverflow.com/questions/11436594/how-to-fix-double-encoded-utf8-characters-in-an-utf-8-table БУДЕТ абсолютно повреждать данные где-то в базе данных! Обработка миллионов строк данных — вот откуда я знаю, что это правда.

Ответить или комментировать

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