|
|
|
| Здравствуйте!
Столкнулся с такой проблемой:
В базе данных (UTF-8) следующие записи:
логин
login
Выполняю следующие запросы (обратите внимание на регистр):
SELECT * FROM users WHERE login LIKE 'логин'
1 результат
SELECT * FROM users WHERE login LIKE 'ЛОГИН'
0 результатов
SELECT * FROM users WHERE login LIKE 'login'
1 результат
SELECT * FROM users WHERE login LIKE 'LOGIN'
1 результат
В чем подвох?
У русских символов регистр получается важен, а у английских - нет?
Как можно сделать, чтобы и у русских и у английских символов регистр был не важен?
Т.е. чтобы при всех приведенных выше запросов было по 1 результату?
Спасибо. | |
|
|
|
|
|
|
|
для: madv
(03.04.2010 в 17:24)
| | Проблема на сервере хостинга или на локальной тестовой машине?
Первую должн решать хостер.
По поводу второй ... придется строить свои таблицы сопоставления... | |
|
|
|
|
|
|
|
для: Trianon
(03.04.2010 в 18:09)
| | Пока только на локалке проблема, на хостинг пока не выкладывал.
>По поводу второй ... придется строить свои таблицы сопоставления...
Т.е. дело в настройках MySQL? А каким образом можно построить свои таблицы сопоставления? | |
|
|
|
|
|
|
|
для: madv
(03.04.2010 в 17:24)
| | > В чем подвох?
> У русских символов регистр получается важен, а у английских - нет?
> Как можно сделать, чтобы и у русских и у английских символов регистр был не важен?
Недавно мы занимались ускорением нашего движка сравнения данных в dbForge Studio for MySQL для новой версии 4.20, некоторые аспекты требовали более углубленного изучения кодировок MySQL и способов их сопоставления. Поэтому на Ваш вопрос можем ответить следующее:
UTF-8 - это лишь способ кодировки строки. В MySQL для UTF-8 доступны только ci (case insensitive collation) нечувствительные к регистру способы сопоставления. Исходя из приведенных Вами результатов запроса, коллейшн у таблицы utf8_general_ci, а следовательно для других языков, отличных от английского, регистр будет учитываться. К сожалению cyrillic или russian utf-8 коллешнов в MySQL нет, поэтому воспользуйтесь инвариантным языком сопоставления, т.е. выберите utf8_unicode_ci способ сопоставления. В этом случае результат будет таковым:
SELECT * FROM users WHERE login LIKE 'логин'
1 результат
SELECT * FROM users WHERE login LIKE 'ЛОГИН'
1 результат
SELECT * FROM users WHERE login LIKE 'login'
1 результат
SELECT * FROM users WHERE login LIKE 'LOGIN'
1 результат
Однако следует предупредить, что в некоторых языках есть исключения в правилах перевода символов из верхнего регистра в нижний и наоборот, например, в турецком языке. Это может привести к не верному выводу результата запроса, при использовании инвариантного способа сопоставления. Если в Вашей таблице не предполагается сохранять данные для других языков, отличных от английского и русского, то utf8_unicode_ci отлично подойдет для этих целей. | |
|
|
|
|
|
|
|
для: devart
(06.04.2010 в 14:10)
| | А чем utf8_bin не устраивает? | |
|
|
|
|
|
|
|
для: oliss
(06.04.2010 в 16:32)
| | Автору топика необходимо игнорировать регистр символов, тогда как utf8_bin работает как Case Sensitive collation, но это совсем разные вещи. Любой бинарный collation направлен на сравнение Code Points в Unicode строке и никак не учитывает инвариантную специфику языков, в отличие от любого Case Sensitive collation. | |
|
|
|