MySQL и русские названия

Статус
В этой теме нельзя размещать новые ответы.

Den1xxx

Постоялец
Регистрация
15 Янв 2014
Сообщения
290
Реакции
168
Здравствуйте.
Столкнулся со странным поведением MySQL.
В БД есть таблица с кешем пользователей.
Так вот, попытался найти одинаковые ники таким запросом:
Код:
SELECT `nicks` FROM `users_cache`
WHERE `nicks`
IN (
SELECT `nicks`
FROM `users_cache`
GROUP BY `nicks`
HAVING COUNT( `nicks` ) > 1
)
Выводит:
Код:
array (
  0 =>
  array (
    'nicks' => 'Артём',
  ),
  1 =>
  array (
    'nicks' => 'Александр',
  ),
  2 =>
  array (
    'nicks' => 'Максим',
  ),
  3 =>
  array (
    'nicks' => 'александр',
  ),
  4 =>
  array (
    'nicks' => 'ольга',
  ),
  5 =>
  array (
    'nicks' => 'максим',
  ),
  6 =>
  array (
    'nicks' => 'Ольга',
  ),
  7 =>
  array (
    'nicks' => 'Артем',
  ),
)
Выходит, что для MySQL 'Артём'=='Артем', 'Ольга'=='ольга' и так далее.
С чем это связано и как заставить БД нормально сравнивать такие строки?
С английским такой засады почему-то нет.
Подумываю, чтобы русские буквы в никах запретить
 
а причем тут мускул, если регистры и буквы разные.
делай в коде таблицу соответствий для замены е на ё итд и причесывай к одному виду, например все в нижнем регистре.

в английском нет е и ё, как и и й итд

затов немецком или финском будет таже проблема
 
а причем тут мускул, если регистры и буквы разные.
делай в коде таблицу соответствий для замены е на ё итд и причесывай к одному виду, например все в нижнем регистре.

в английском нет е и ё, как и и й итд

затов немецком или финском будет таже проблема
Как при чём мускул? Я же ему запрос отправляю, а он считает «e» и «ё», заглавные и строчные одинаковыми буквами?
 
Кодировка таблицы?
 
UCASE (str) или UPPER(str) попробовать думаю надо для приведения строк в регистр. Попробуй так. По идее будет 'Александр' = 'александр', С "ё" надо помучится.


Код:
SELECT upper(`nicks`) as `nicks` FROM `users_cache`
WHERE `nicks`
IN (
SELECT upper(`nicks`) as `nicks`
FROM `users_cache`
GROUP BY `nicks`
HAVING COUNT( `nicks` ) > 1
)
 
погуглите case sensitive mysql

что выводит если задаёте вот так?
Код:
SELECT `nicks` FROM `users_cache`
WHERE BINARY `nicks`
IN (
SELECT `nicks`
FROM `users_cache`
GROUP BY `nicks`
HAVING COUNT( `nicks` ) > 1
)
 
UCASE (str) или UPPER(str) попробовать думаю надо для приведения строк в регистр. Попробуй так. По идее будет 'Александр' = 'александр', С "ё" надо помучится.


Код:
SELECT upper(`nicks`) as `nicks` FROM `users_cache`
WHERE `nicks`
IN (
SELECT upper(`nicks`) as `nicks`
FROM `users_cache`
GROUP BY `nicks`
HAVING COUNT( `nicks` ) > 1
)
Мне наоборот надо отличия, а не совпадения, Ваш совет не в тему

Кодировка таблицы?
Кодировка utf8, а вот general settings почему-то cp1251 Может в этом и дело, спс.
Сейчас переношу сайт на другой хостинг, там другие настройки и возможно такой шляпы нет.
Всем спасибо, кто откликнулся и постарался помочь. Если проблемы проявятся, отпишу.
 
Мне наоборот надо отличия, а не совпадения, Ваш совет не в тему


Кодировка utf8, а вот general settings почему-то cp1251 Может в этом и дело, спс.
Сейчас переношу сайт на другой хостинг, там другие настройки и возможно такой шляпы нет.
Всем спасибо, кто откликнулся и постарался помочь. Если проблемы проявятся, отпишу.
+ кодировка, оканчивающаяся на _ci регистронезависимая для выборки
 
ci = case insensitive, например кодировка utf8_general_ci будет работать без учёта регистра.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху