MySQL cp1251 => uft8

123
EM
На сайте с 16.12.2005
Offline
108
#11
'[umka:
;9699061']Так просто поменяйте на таблице кодировку сопоставления на utf8_general_ci и всё.
Динамически её менять смысла нет, т.к. в зависимости от неё перестраивается индекс.

Видимо только так. Это проще будет. Спасибо.

N
На сайте с 06.05.2007
Offline
419
#12
LEOnidUKG:
Я вас уверяю, что UTF8 тут воооообще не при чём.

Это не так.

В некоторых случаях кодировки отличаются способом сравнения букв

в cp1251 в case insensitive collation е != ё, а в случае с utf8 e=ё.

Хотя, буква ё это единственный такой странный случай. Многие об этом не знают.

Кнопка вызова админа ()
[umka]
На сайте с 25.05.2008
Offline
456
#13
netwind:
Хотя, буква ё это единственный такой странный случай. Многие об этом не знают.

Ну это в русском только один такой "умлаут", а в немецком, например, их несколько, а в скандинавских ещё больше.

Лог в помощь!
N
На сайте с 06.05.2007
Offline
419
#14

[umka], ну так ведь и cp1251 и utf8 - обе русские. почему поведение в разных вариантах одного и того же языка различается? вот в чем странность

[umka]
На сайте с 25.05.2008
Offline
456
#15

Не, utf-8 просто универсальная. И скорее всего, там дефолтные правила сравнения, видимо, не делают разницы между "à", "á", "â", "ã", "ä", "å" и просто "a", и т.д.

В php правила сравнения устанавливаются с помощью setlocale, и в локале ru_RU буквы "е" и "ё" считаются разными. А в MySQL это немного по-другому.

N
На сайте с 06.05.2007
Offline
419
#16
[umka:
;9699808]В php правила сравнения устанавливаются с помощью setlocale, и в локале ru_RU буквы "е" и "ё" считаются разными.

значит это баг в php. mysql проверяет на основе официальных collation chars :

http://unicode.org/charts/uca/chart_Cyrillic.html

Е и Ё одинаковы с точностью до Secondary Difference (хз что это) - они там в одной строке нарисованы.

зачем php на это плюет? или я что-то напутал?

[umka]
На сайте с 25.05.2008
Offline
456
#17

Пхп сравнивает строки побайтово, поэтому символы "е" и "ё" для него разные.

Чтобы использовать "умное сравнение", есть специальные функции

http://www.php.net/manual/ru/class.collator.php

И будут сравниваться уже не просто символы, а буквы :)

"Сила сравнения" — это как раз то, о чём вы говорите.

http://php.net/manual/ru/collator.setstrength.php

Буквы "ё" и "ж" отличаются уже по первичному признаку.

Буквы "ё" и "е" схожи по первичному, но отличаются по вторичному признаку.

Буквы "ё" и "Ё" отличаются лишь по третичному признаку.

N
На сайте с 06.05.2007
Offline
419
#18

[umka], в php есть функция mb_stristr, которая позволяет проверить на равенство строки, при условии что они уже одинаковы по длине. она считает равными строчные и прописные буквы. Ей я и проверял.

Потестировал и эти функции. Получается, что mb-функции php для русского используют primary difference. А в mysql по-умолчанию secondary, причем даже без возможности выбора.

Разброд и шатание в стане вебдевелоперов.

DA
На сайте с 19.05.2011
Offline
8
#19

На сколько я понимаю, в кодировке cp1251 буквы е и ё (как и "и" "й") разные и это правильно, в utf8 - одинаковые и это баг http://bugs.mysql.com/bug.php?id=34096 который, как я понимаю, исправлен в последних версиях mysql.

Если вы переведете текст в utf8 то рискуете получить неожиданный результат на разных версиях mysql. Полагаю, что вам надо проверять строку на содержание этих символов и делать поиск по двум строкам (т.е. одна содержит е, вторая ё)

LEOnidUKG
На сайте с 25.11.2006
Offline
1726
#20

А может быть в бд просто все ё заменить на е и не париться?

При регистрации делать тоже самое.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий