Я пытаюсь преобразовать нашу базу данных с latin1 в UTF-8. К сожалению, я не могу сделать массовое одноключение, так как приложение должно оставаться в сети, и у нас есть 700 ГБ базы данных для конвертирования.
Итак, я пытаюсь использовать небольшой mysql-взлом преобразования таблиц в UTF-8, но не данные. Я бы хотел, чтобы данные были прочитаны, преобразованы и заменены в реальном времени. (Преобразование JIT, если вы это сделаете)
В настоящее время наше php-приложение использует все значения по умолчанию, поэтому он подключается к mysql, используя набор символов latin1, и он переносит данные UTF-8, закодированные в latin1. Когда вы просматриваете данные с latin1, символы UTF-8 отображаются, как ожидалось. Когда вы просматриваете данные с помощью UTF-8, все становится беспорядочным.
Итак, я предлагаю принудительно установить набор символов mysql в UTF-8, а затем при необходимости сделать преобразование данных в нужное время. Теперь, видя, что cp1252/windows-1252 является подмножеством UTF-8, он не настолько прямолинейный (насколько я могу видеть), чтобы обнаружить кодировку cp1252/windows-1252.
Я написал следующий код, который пытается обнаружить кодировку cp1252/windows-1252 и преобразовать по мере необходимости. Он также должен обнаруживать правильно закодированные символы UTF-8 и ничего не делать.
$a = 'Card☃'; //cp1252 encoded
$a_test = '☃'.$a; //add known UTF8 character
$c = mb_convert_encoding($a_test, 'cp1252', 'UTF-8');
// attempt to detect known utf8 character after conversion
if (mb_strpos($c, '☃') === false) {
// not found, original string was not cp1252 encoded, so print
var_dump($a);
} else {
// found, original string was cp1252 encoded, remove test character and print
// This case runs
$c = mb_strcut($c, 1);
var_dump($c);
}
$a = 'COD☃'; //proper UTF8 encoded
$a_test = '☃'.$a; //add known UTF8 character
$c = mb_convert_encoding($a_test, 'cp1252', 'UTF-8');
// attempt to detect known utf8 character after conversion
if (mb_strpos($c, '☃') === false) {
// not found, original string was not cp1252 encoded, so print
// This case runs
var_dump($a);
} else {
// found, original string was cp1252 encoded, remove test character and print
$c = mb_strcut($c, 1);
var_dump($c);
}
Результат запуска этого кода:
string 'Card☃' (length=7)
string 'COD☃' (length=6)
Я понимаю, что выполнение этого на всех строках, выходящих из базы данных, будет иметь влияние на производительность, но еще не измерено, но если я смогу сделать JIT-преобразование, прежде чем переключать все, то это мне того стоит.
Есть ли у кого-нибудь указания относительно того, как оптимизировать это?