Сравните одинаковые значения, хранящиеся в разных кодировках

Этот вопрос не является дубликатом Сравнение строк 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»).

6

Решение

Появляется приложение, которое пишет в 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 таблица и конвертировать на лету, как записи добавляются или редактируются.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector