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

Вернемся к тому, что каждый символьный набор имеет соответствующий ему один или несколько порядков сопоставления. Поэтому следующий оператор вызовет сообще­ние об ошибке, так как 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 напрямую.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: