Поиск

Порядок сопоставления должен подходить набору символов

Вернемся к тому, что каждый символьный набор имеет соответствующий ему один или несколько порядков сопоставления. Поэтому следующий оператор вызовет сообще­ние об ошибке, так как Iatin2_bin не является допустимым порядком сопоставления для набора символов latinl:

mysql; SELECT __latinl 'x' COLLATE Iatin2_bin; ERROR 1251: COLLATION 'Iatin2_bin' is not valid for CHARACTER SET 'latinl'

В некоторых случаях выражения, которые работали до MySQL 4.1, терпят неудачу в версиях от 4.1 и выше, если не принимать во внимание набор символов и порядок сопос­тавления. Например, в версиях, предшествующих 4.1, следующий оператор работает нормально:

mysql; SELECT SUBSTRING_INDEX(USER(),'@',1);

SUBSTRING_INDEX(USER(),'@',1) |

root I

После обновления до версии 4.1 он выдает сбой:

mysql; SELECT SUBSTRING_INDEX(USER(),'g',1); ERROR 1267 (HY000): Illegal mix of collations

(utf8_general_ci,IMPLICIT) and (latinl_swedish_ci,COERCIBLE) for operation 'substr_indexf

Причина состоит в том, что имена пользователей сохраняются в кодировке UTF8 (см. раздел 3.6). В результате функция USER () и литерал ' @' имеют разные наборы символов (а потому и разные порядки сопоставления).

raysql; SELECT COLLATION(USER()), COLLATION('@');

I COLLATION (USER ()) | COLLATION ('@')

! utf8_general_ci | latinl_swedish_ci I

+-------------- +-------------- +

Один способов обойти это, состоит в том, чтобы заставить MySQL интерпретировать литеральную строку как utf 8:

mysql; SELECT

I SUBSTRING_INDEX(USER(),_utf8'@ M) |

I root

+---------------------------

Другой способ предполагает изменение набора символов и порядок сопоставления для соединения на utf8. Вы можете сделать это либо с помощью оператора SET NAMES 'utf8', либо установкой значений системных переменных character_set_connection и collation_connection напрямую.