8 июн. 2014 г.

Пропали буквы "И" и "ш" после восстановления базы mediawiki

Вот же послал нам высший разум наказание в виде так называемой СУБД MySQL. Неважно, как круто корпорация Oracle выглядит в бизнес отчетах, важно, что ваши бесценные данные могут испортиться в результате простой операции архивного копирования. А если архивируется база mediawiki, где в односимвольных кодировках записаны строки в UTF-8, которые при бэкапе будут побуквенно переведены в UTF-8... Удивительно, но есть люди, которые даже могут во всем этом разобраться.

Из кириллического подмножества символов UTF-8 почему-то не повезло буквам "ш" (0xD188) и "И" (0xD098). Вместо них пишутся в файл коды 0xD13F и 0xD03F.

Лечим следующим образом. После восстановления из архива базы mediawiki сформируем запросы для обновления символьных полей. Для буквы "И":

SELECT 
  CONCAT('UPDATE ', table_name, ' SET ', column_name, 
    ' = REPLACE(', column_name, ', 
    CONCAT( CHAR(208), CHAR(63) ), 
    CONCAT( CHAR(208), CHAR(152) ));') 
FROM columns 
WHERE 
  table_schema = 'your_schema_name_here' 
  AND data_type = 'varchar'
И для буквы "ш":
SELECT 
  CONCAT('UPDATE ', table_name, ' SET ', column_name, 
    ' = REPLACE(', column_name, ', 
    CONCAT( CHAR(209), CHAR(63) ), 
    CONCAT( CHAR(209), CHAR(136) ));') 
FROM columns 
WHERE 
  table_schema = 'your_schema_name_here' 
  AND data_type = 'varchar'
Результаты приведенных запросов -- готовые SQL команды для замены неправильных последовательностей байтов на правильные во всех строковых полях. Экспортируем их в текст и выполняем на базе данных.

UPD: Версия MySQL 5.5.32-cll-lve. Бэкап базы данных через phpMyAdmin 4.1.8 и cPanel 11.42.1.

Комментариев нет:

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