MySQL cp1251 => uft8

12 3
EM
На сайте с 16.12.2005
Offline
108
1736

Нужна помощь!

Имеется таблица, данные хранятся в cp1251_general_ci.

Мне нужно сделать поиск по имени человека, причем так, чтобы буквы е и ё считались одинаковыми.

Сейчас есть пользователь с фамилией "Рублев", но если задать ее в запросе как "Рублёв" (нужно, чтобы они считались одинаковыми) - возвращает ноль рядов.

Промониторил СЕРП Гугла и попробовал так:


$_search='Рублёв';
$_search=iconv('cp1251','utf-8',$_search);

затем запросы на бд:


SET NAMES utf8
SET CHARACTER SET utf8
SELECT * FROM register WHERE name="'.$_search.'"

Результат - ноль рядов(((

LEOnidUKG
На сайте с 25.11.2006
Offline
1753
#1

Я вас уверяю, что UTF8 тут воооообще не при чём.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
[umka]
На сайте с 25.05.2008
Offline
456
#2
e_moon:
Имеется таблица, данные хранятся в cp1251_general_ci.

Все данные MySQL хранит в UTF-8. А то, о чём вы говорите, называется кодировка сопоставления. Что это такое, вы можете узнать из документации.

При работе с базой данных нужно использовать ту кодировку, в которой работает ваш сайт.

Т.е. если сайт в CP1251, то и при работе с базой нужно сделать

SET CHARACTER SET CP1251

И никаких iconv не нужно, база всё сделает сама.

Лог в помощь!
EM
На сайте с 16.12.2005
Offline
108
#3
Я вас уверяю, что UTF8 тут воооообще не при чём.

Ну как? Объясните? Пока понял одну вещь - в utf буквы е и ё идут одинаковые.

Можно, конечно делать REGEXP-запрос, вроде:

SELECT * FROM table WHERE name REGEXP "Рубл[е|ё]в"

но это же ни FULLTEXT-поиска в перспективе, ни других возможностей...

У меня задача - задать SELECT запрос, допустим, name="Ёлка" и получить 2 ряда, где 1) "Ёлка" и 2) "Елка". Это реально?

e_moon добавил 23.11.2011 в 16:46

'[umka:
;9698872']Все данные MySQL хранит в UTF-8. А то, о чём вы говорите, называется кодировка сопоставления. Что это такое, вы можете узнать из документации.

При работе с базой данных нужно использовать ту кодировку, в которой работает ваш сайт.
Т.е. если сайт в CP1251, то и при работе с базой нужно сделать
SET CHARACTER SET CP1251
И никаких iconv не нужно, база всё сделает сама.

Я ж говорю, что пытаюсь применить рекомендации которые удалось найти. Видимо чего-то не догоняю. У меня сейчас получается только буквальный поиск:


SELECT * FROM register WHERE name="Рублёв"

вернет одну запись с именем Рублёв.


SELECT * FROM register WHERE name="Рублев"

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

А мне нужно одним запросом получить обе записи...

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

А... я сразу не воткнул :) Проблема в буквах "е" и "ё".

У меня задача - задать SELECT запрос, допустим, name="Ёлка" и получить 2 ряда, где 1) "Ёлка" и 2) "Елка". Это реально?

Это реально и у меня вот на тестовой таблице такой результат получается и при использовании сопоставления utf-8 и cp1251.

Т.е. на один запрос выдаёт 2 ряда.

PD
На сайте с 05.09.2011
Offline
15
#5

А phpmyadmin поиск не работает?)

Баннерная сеть + псевдоподписки (2 в 1)! Впервые в WAP`e! Конвертабельный лейдинг! Ратио 1:2! (http://rusban.su/?ref=1)
EM
На сайте с 16.12.2005
Offline
108
#6
'[umka:
;9698919']А... я сразу не воткнул :) Проблема в буквах "е" и "ё".

Это реально и у меня вот на тестовой таблице такой результат получается и при использовании сопоставления utf-8 и cp1251.
Т.е. на один запрос выдаёт 2 ряда.

А как Вы этого добились? Т.е. какой у Вас предварительный запрос на SET NAMES и т.д?

e_moon добавил 23.11.2011 в 16:59

PHPSID:
А phpmyadmin поиск не работает?)

В phpMyAdmin поиск работает точно так же - буквы е и ё считает разными.

[umka]
На сайте с 25.05.2008
Offline
456
#7
e_moon:
А как Вы этого добились? Т.е. какой у Вас предварительный запрос на SET NAMES и т.д?

Сорри, я соврал.

Для каждого поля таблицы может быть указана своя кодировка сопоставления.

Если у поля name установлено сопоставление cp1251_general_ci, то выдаётся только одна строка с точным соответствием буквы, но если сопоставление установлено utf8_general_ci, то выдаются обе строки.

Harius
На сайте с 24.08.2008
Offline
251
#8

А при чём здесь кодировки?

Может просто SELECT * FROM register WHERE name="Рублёв" or name="Рублев"

➨ Проверка качества ссылок в Яндексе https://xtool.ru - проверка PR,Траст, спам,TF,CF,LVL,ВС,POS,TrF,inY.. + экспорт в xls ➨7 нейросетей онлайн бесплатно без регистрации https://ntema.ru
EM
На сайте с 16.12.2005
Offline
108
#9
Harius:
А при чём здесь кодировки?
Может просто SELECT * FROM register WHERE name="Рублёв" or name="Рублев"

Тогда уж проще REGEXP. Мне нужно универсальный способ поиска, пример - это частный случай. В базе штук 1000 пользователей. Есть Фёдоров и т.п...

Сорри, я соврал.
Для каждого поля таблицы может быть указана своя кодировка сопоставления.
Если у поля name установлено сопоставление cp1251_general_ci, то выдаётся только одна строка с точным соответствием буквы, но если сопоставление установлено utf8_general_ci, то выдаются обе строки.

Попробую покопать в этом направлении. Наверняка можно в запросе динамически менять сопоставление. Или временную таблицу пробовать создавать. Что-то должно же быть!

[umka]
На сайте с 25.05.2008
Offline
456
#10
e_moon:
Попробую покопать в этом направлении. Наверняка можно в запросе динамически менять сопоставление. Или временную таблицу пробовать создавать. Что-то должно же быть!

Так просто поменяйте на таблице кодировку сопоставления на utf8_general_ci и всё.

Динамически её менять смысла нет, т.к. в зависимости от неё перестраивается индекс.

12 3

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