Этот вопрос не является дубликатом Сравнение строк PHP между двумя разными типами кодирования потому что мой вопрос требует решения SQL, а не решения PHP.
контекст ► Есть музей с двумя базами данных с одинаковой кодировкой и сопоставлением (engine=INNODB charset=utf8 collate=utf8_unicode_ci
) используется двумя различными системами PHP. Каждая система PHP хранит так же данные в разные Кстати, следующее изображение является примером:
Так уже хранится множество данных, и обе системы работают нормально, поэтому я не могу изменить кодировку PHP или базы данных ». Одна система управляет продажами из кассы, другая — продажами с веб-сайта.
Эта проблема ► Мне нужно сравнить правую колонку (tipo_boleto_tipo
) в левую колонку (tipo
), чтобы получить значение в другом столбце левой таблицы (не видно на изображении), но я не получаю никаких результатов, потому что одни и те же значения хранятся по-разному, например, когда я ищу «Niños», он не найден, потому что он хранился как «Nios» («дети» на испанском языке). Я пытался сделать это через PHP с помощью utf8_encode
а также utf8_decode
но это недопустимо медленно, поэтому я думаю, что лучше делать это только с SQL. Эти данные будут использоваться для унифицированного отчета о продажах (кассовые сборы и интернет) за разные промежутки времени, и он должен сравнивать сотни тысяч строк, поэтому он так медленно работает с PHP.
Вопрос ► Есть что-нибудь подобное utf8_encode
или же utf8_decode
в MYSQL, что позволяет мне соответствовать эквивалент значения обоих столбцов? Любое другое предложение будет приветствоваться.
Далее мой текущий код (без результатов):
DATABASE TABLE COLUMN
▼ ▼ ▼
SELECT boleteria.tipos_boletos.genero ◄ DESIRED COLUMN.
FROM boleteria.tipos_boletos ◄ DATABASE WITH WEIRD CHARS.
INNER JOIN venta_en_linea.ventas_detalle ◄ DATABASE WITH PROPER CHARS.
ON venta_en_linea.ventas_detalle.tipo_boleto_tipo = boleteria.tipos_boletos.tipo
WHERE venta_en_linea.ventas_detalle.evento_id='1'
AND venta_en_linea.ventas_detalle.tipo_boleto_tipo = 'Niños'
Линия ON venta_en_linea.ventas_detalle.tipo_boleto_tipo = boleteria.tipos_boletos.tipo
никогда не сработает, потому что оба значения разные («Niños» против «Niños»).
Появляется приложение, которое пишет в boleteria
база данных не хранит правильный UTF-8. Набор символов столбца базы данных относится к тому, как MySQL интерпретирует строки, но ваше приложение все еще может писать в других наборах символов.
Я не могу точно сказать из вашего примера, что такое неправильный набор символов, но, предполагая, что это Latin-1, вы можете преобразовать его в latin1 (чтобы сделать его «правильным»), а затем преобразовать его обратно в «фактический» utf8:
SELECT 1
FROM tipos_boletos, ventas_detalle
WHERE CONVERT(CAST(CONVERT(tipo USING latin1) AS binary) USING utf8)
= tipo_boleto_tipo COLLATE utf8_unicode_ci
Я видел это слишком часто в приложениях PHP, которые с самого начала не были написаны с осторожностью для использования строк UTF-8. Если вы считаете, что производительность слишком низкая, и вам необходимо часто выполнять конвертацию, и у вас нет возможности обновить приложение, записывающее данные неправильно, вы можете добавить новый столбец и вызвать tipos_boletos
таблица и конвертировать на лету, как записи добавляются или редактируются.
Других решений пока нет …