Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с регистром русских символов в utf-8
 
 автор: madv   (03.04.2010 в 17:24)   письмо автору
 
 

Здравствуйте!
Столкнулся с такой проблемой:
В базе данных (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 результату?
Спасибо.

  Ответить  
 
 автор: Trianon   (03.04.2010 в 18:09)   письмо автору
 
   для: madv   (03.04.2010 в 17:24)
 

Проблема на сервере хостинга или на локальной тестовой машине?
Первую должн решать хостер.
По поводу второй ... придется строить свои таблицы сопоставления...

  Ответить  
 
 автор: madv   (03.04.2010 в 18:20)   письмо автору
 
   для: Trianon   (03.04.2010 в 18:09)
 

Пока только на локалке проблема, на хостинг пока не выкладывал.

>По поводу второй ... придется строить свои таблицы сопоставления...
Т.е. дело в настройках MySQL? А каким образом можно построить свои таблицы сопоставления?

  Ответить  
 
 автор: devart   (06.04.2010 в 14:10)   письмо автору
 
   для: 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 отлично подойдет для этих целей.

  Ответить  
 
 автор: oliss   (06.04.2010 в 16:32)   письмо автору
 
   для: devart   (06.04.2010 в 14:10)
 

А чем utf8_bin не устраивает?

  Ответить  
 
 автор: devart   (06.04.2010 в 17:16)   письмо автору
 
   для: oliss   (06.04.2010 в 16:32)
 

Автору топика необходимо игнорировать регистр символов, тогда как utf8_bin работает как Case Sensitive collation, но это совсем разные вещи. Любой бинарный collation направлен на сравнение Code Points в Unicode строке и никак не учитывает инвариантную специфику языков, в отличие от любого Case Sensitive collation.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования