Как выполнять запросы MySQL к тексту с умлаутами в Drupal?

Мне нужно различать узлы, начинающиеся с «О», и узлы, начинающиеся с «Ö» (о умлаут).

Проблема в том, что, поскольку таблица узлов и столбец title имеют параметры сортировки utf8_general_ci, MYSQL не обрабатывает умлаут o и ö по-разному, и этот запрос возвращает узлы, начинающиеся с O И узлы, начинающиеся с Ö

SELECT node.nid AS nid
FROM node AS node
ГДЕ node.status ‹> 0
AND SUBSTR( node.title, 1, 1 ) = 'O'

Поскольку все модули Drupal используют параметры сортировки utf8_general_ci, я думаю, что изменение параметров сортировки таблицы и всей базы данных, вероятно, не является хорошей идеей.

Что такое хороший обходной путь для этого?


person hitfactory    schedule 17.09.2010    source источник


Ответы (2)


Вы можете выполнить сравнение, используя сортировку, отличную от той, которую используют столбцы:

mysql> SELECT 'foo'='föo' COLLATE 'utf8_general_ci';
1
mysql> SELECT 'foo'='föo' COLLATE 'utf8_swedish_ci';
0

(o и ö — это разные буквы в шведском сопоставлении. Вы также можете использовать utf8_bin, если не хотите, чтобы совпадали какие-либо разные символы, даже разные регистры одной и той же буквы.)

Однако сравнение столбцов, где параметры сортировки не совпадают с параметрами сортировки каждого столбца, означает, что индексы использовать нельзя. Таким образом, может быть более эффективным просто ALTER таблицы для более конкретной сортировки, которую вы хотите.

person bobince    schedule 17.09.2010
comment
Добавление COLLATE к запросам пошло не так с запросами с соединениями, поэтому в итоге я переключил базу данных, таблицы и столбцы на utf8_swedish_ci, используя скрипт, предложенный шведской группой пользователей Drupal. Если кому-то интересно, это здесь: phoca .cz/documents/38-tools/ - person hitfactory; 18.09.2010
comment
Хотя это хорошее общее решение MySQL, оно требует обхода API базы данных Drupal, поскольку Drupal 6 в настоящее время не поддерживает ничего, кроме utf8_general_ci. - person ; 19.09.2010

К сожалению, как вы заметили, в Drupal 6 применяется сортировка utf8_general_ci.

Тем не менее, это известная проблема, и люди работали над тем, чтобы параметры сортировки могли указываться в settings.php: сопоставление базы данных по умолчанию. не уважается

В этой проблеме в настоящее время есть патч (#90) для Drupal 6 в обзоре, который добавляет эту возможность. После исправления все, что вам нужно сделать, это добавить:

$db_collation = 'utf8_swedish_ci`;

в ваш файл settings.php.

person Community    schedule 19.09.2010
comment
Спасибо за подсказку про патч. Даст ему спину. - person hitfactory; 22.09.2010