Использование Solr для индексации столбца latin1, который содержит данные utf8 - PullRequest
1 голос
/ 21 октября 2011

Я работаю над веб-приложением на основе PHP, в котором имеется база данных MySQL, где все текстовые столбцы используют кодировку latin1, но в них есть данные utf8.

Это прекрасно работает для приложения PHP, которое использует кодировку latin1 для соединения с БД, чтобы извлечь данные, а затем вывести их непосредственно в браузер, сообщив браузеру, что страница utf8.

Однако сейчас мы пытаемся использовать Solr для индексации базы данных, используя коннектор MySQL JDBC, и в индексе появляются бессмысленные слова.

Вот строка подключения:

<dataSource
    url="jdbc:mysql://localhost/db_name?characterEncoding=latin1&amp;characterSetResults=utf8"
    user="user" password="password" />

Есть ли способ заставить Solr извлечь данные как latin1, а затем обработать их как utf8 без их преобразования? Я попытался изменить параметры characterEncoding и characterSetResults в строке подключения JDBC, но безрезультатно.

Я уверен, что правильный способ исправить это - преобразовать все текстовые столбцы в utf8, но я бы предпочел не идти по этому пути (пока), потому что это нарушит веб-приложение.

1 Ответ

2 голосов
/ 19 января 2012

Вы правы, правильный путь - это исправить вашу базу данных.Поверьте мне, я только что прошел это (чтобы исправить установку solr, как ни странно), и чем раньше вы сможете это исправить, тем меньше это причинит вам боль.

Есть два способа исправить ваши данные, хранящиеся внеправильная кодировка:

  1. mysqldump для всех данных в качестве латиницы 1 (--default-character-set=latin1), измените определения таблиц на CHARACTER SET=utf8 вместо latin, а затем повторно импортируйте дамп.

  2. Выполнить два оператора alter для каждого неправильно закодированного столбца

    ALTER table MODIFY columns BINARY

    ALTER TABLE MODIFY column VARCHAR(255) CHARSET utf8

    , изменив значение на BINARYВо-первых, вы можете обмануть MySQL, чтобы не запускать преобразование latin1 => utf8, которое, в вашем случае, дважды кодировало бы и сломало ваши данные.

Если ваша БД велика, 1будет быстрее, чем 2.

Сразу после этого просто сконфигурируйте ваше PHP-приложение для связи с MySQL, используя utf8.Это можно сделать, отправив SET NAMES utf8 в качестве первого запроса каждого соединения.Если PHP уже отправляет данные utf8 в MySQL, это все, что вам нужно сделать.

Если после этого фантастического и подробного ответа вы все еще ищете хак ... Попробуйте настроить JDBC наподключитесь как UTF8, но посмотрите, есть ли способ заставить его отправить предварительную команду, прежде чем она выполнит какую-либо работу.

Если вы выполните эту команду: SET NAMES latin1, то теоретически Solr должен подключиться как UTF8 и обработатьданные, поступающие из соединения как UTF8, но MySQL будет рассматривать соединение как соединение latin1, а не преобразовывать любые данные, поступающие из ваших столбцов latin1.

...