[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как поиск частичного соответствия в базе запросу.
yok
Здравствуйте.
В базе поле `kontora` где названия предприятия.
Торговый дом ООО
Закрытый дом ЗАО
Еще предприятие ОАО
и так далее.
Запрос на полное соответствие записи поля это
$sql="SELECT * FROM `kontra` WHERE `kontora`='".$searchcontora."'";
А если я введу для поиска : дом, то уже не получится.
Как то это решается в самом запросе, substring , типа.



Спустя 2 минуты, 43 секунды (18.04.2012 - 08:51) TranceIT написал(а):
Оператор LIKE

Спустя 23 минуты, 19 секунд (18.04.2012 - 09:15) yok написал(а):
Большое спасибо.

Спустя 26 минут, 4 секунды (18.04.2012 - 09:41) ИНСИ написал(а):
Я бы посоветовал вам писпользовать Match Against : http://www.mysql.ru/docs/man/Fulltext_Search.html

Спустя 1 час, 56 минут, 9 секунд (18.04.2012 - 11:37) yok написал(а):
INSIDIOUS , спасибо.

Я совсем не подумал о поиске без учета регистра.
Как это реализовать возможно?
$sql="SELECT * FROM `kontra` WHERE `kontora` LIKE '%$searchcontora%' ";
найдет дом, но Дом уже нет.
думаю такой же подход и при FULLTEXT индексе
$sql="SELECT * FROM `kontra` WHERE MATCH (kontora) AGAINST ($searchcontora) ";
Как искать без учета регистра?

Спустя 26 минут, 13 секунд (18.04.2012 - 12:03) ИНСИ написал(а):
yok у вас кодировка таблицы какая?

Спустя 2 минуты, 37 секунд (18.04.2012 - 12:06) yok написал(а):
Что то я не пойму, есть читаю использование LOWER, UPPER in mysql
$sql="SELECT * FROM `kontra` WHERE LOWER(kontora) LIKE '%searchcontora%'";
что то не срабатывает. Я вроде получается занижаю регистр при выборке в поле kontora, может надо AND .
Или я вообще не туда смотрю?

Спустя 50 секунд (18.04.2012 - 12:06) yok написал(а):
Я даже не знаю. В сентосе 5.5 utf8 скорей всего.
Или как узнать?
Поле varchar из которого пытаюсь выбрать.
Цитата
[root@sunport ~]# locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
[root@sunport ~]# 

таблицы помню создавал из терминала, но о кодировках ничего делал.

Спустя 4 минуты, 42 секунды (18.04.2012 - 12:11) ИНСИ написал(а):
yok Дело в том, что полнотекстовой поиск плохо работает с сопоставление
utf8_bin. Вам необходимо сопоставление поставить utf8_general_ci. Это сделать надо в phpMyAdmin - если вы им пользуетесь.

Спустя 6 минут, 22 секунды (18.04.2012 - 12:18) yok написал(а):
Я пока хочу просто с like выполнить, без полнотекстного поиска.
Да дело в том, что на сервере помимо этой базы еще есть. Чтоб не затронуть другие.
А нельзя вот как то решить вопрос с помощью LOWER?
Все больше через терминал и с локальной машиной и с сервером.
Давно как то phpmyadmin пользовал, но больше терминалом.

Спустя 8 минут (18.04.2012 - 12:26) ИНСИ написал(а):
yok Кодировка на многое влияет.

Можете попробовать так:
SELECT * FROM `kontra` WHERE UPPER(`kontora`) LIKE UPPER('%$searchcontora%')

Спустя 50 минут, 41 секунда (18.04.2012 - 13:16) yok написал(а):
Что то не работает. Работает также как и без UPPER.
Я попробовал
$sql="SELECT * FROM `kontra` WHERE UPPER(`kontora`)='АЛТАЙТАЛЬ' ";

в базе есть Алтайталь,
я предполагал что запрос поднимет вверх регистр из базы и сравнит, но нет.
Чтото с UPPER не так у меня?

Спустя 6 минут, 44 секунды (18.04.2012 - 13:23) ИНСИ написал(а):
Попробуйте вывести на экран готовый запрос.
exit($sql);

Спустя 20 минут, 57 секунд (18.04.2012 - 13:44) yok написал(а):
О странно, я перешел в терминал и вот что показало.
mysql> select * from kontra where upper(kontora)='NEW';
+-----+---------+------+-------------+-------+------+-------------+-------+-----------+----------+-- -------+------+---------+-------------+
| id | kontora | town | dolzhnost_1 | fio_1 | fax | dolzhnost_2 | fio_2 | telwork_2 | telsot_2 | email_2 | site | bg_cell | shift_color |
+-----+---------+------+-------------+-------+------+-------------+-------+-----------+----------+-- -------+------+---------+-------------+
| 173 | New | | | | | | | | | | | | |
+-----+---------+------+-------------+-------+------+-------------+-------+-----------+----------+-- -------+------+---------+-------------+
1 row in set (0.00 sec)

mysql>

в запросе я поднял и сравнил а в базе только первая большая.
И что это значит?

И так работает.
mysql> select * from kontra where upper(kontora) like '%NE%';
+-----+---------+------+-------------+-------+------+-------------+-------+-----------+----------+-- -------+------+---------+-------------+
| id | kontora | town | dolzhnost_1 | fio_1 | fax | dolzhnost_2 | fio_2 | telwork_2 | telsot_2 | email_2 | site | bg_cell | shift_color |
+-----+---------+------+-------------+-------+------+-------------+-------+-----------+----------+-- -------+------+---------+-------------+
| 173 | New | | | | | | | | | | | | |
+-----+---------+------+-------------+-------+------+-------------+-------+-----------+----------+-- -------+------+---------+-------------+
1 row in set (0.00 sec)

mysql>

правда если поиск по русским то уже проблема
mysql> SELECT * FROM `kontra` WHERE LOWER(`kontora`)='%лтайталь%';
Empty set (0.00 sec)

mysql>

Спустя 15 минут, 39 секунд (18.04.2012 - 14:00) ИНСИ написал(а):
Быть может у вас кодировка файла другая и вместо текста, вставляются вопросики smile.gif Поэтому я и говорю, выведите на экран готовый запрос.

И еще, какая кодировка у вас стоит при соединении с БД?

Спустя 10 минут, 43 секунды (18.04.2012 - 14:10) yok написал(а):
Извините я и думал вывести на экран это в терминале.
Файлы сохраняю в utf8, а вот при соединении с базой не знаю.
Но дело то, в том, что пользователи уже заносили и много. Заносят русские в базу, и выборку делают, и редактируют данные.
in httpd.conf
Цитата

LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

#
# ForceLanguagePriority allows you to serve a result page rather than
# MULTIPLE CHOICES (Prefer) [in case of a tie] or NOT ACCEPTABLE (Fallback)
# [in case no accepted languages matched the available variants]
#
ForceLanguagePriority Prefer Fallback

#
# Specify a default charset for all content served; this enables
# interpretation of all content as UTF-8 by default.  To use the
# default browser choice (ISO-8859-1), or to allow the META tags
# in HTML content to override this choice, comment out this
# directive:
#
AddDefaultCharset UTF-8

я приоритетом работает я туда и не лез.
Вопрос что значит вывести на экран, я же из пхп страницы и делаю запрос, или что сделать надо?

И еще , у меня еще поиск по городу есть, там из базы выбираются города и в select , и там же русские города, Москва допустим, и когда я выбираю Москва, то передается из браузера же русские Москва.
Как вывести на экран?

Спустя 11 минут, 58 секунд (18.04.2012 - 14:22) yok написал(а):
А спасибо за вывод,
SELECT * FROM `kontra` WHERE `kontora` LIKE '%предприятие%' 

но все похоже нормально?
Это на экране после кода exit($sql);

SELECT * FROM `kontra` WHERE `kontora` LIKE '%русск%' 

Спустя 14 минут, 3 секунды (18.04.2012 - 14:36) ИНСИ написал(а):
Попробуйте поставить эту строку, сразу после того как вы установили связь с базой данных:
mysql_query('SET NAMES UTF8 COLLATE utf8_general_ci');

Спустя 20 минут, 27 секунд (18.04.2012 - 14:57) yok написал(а):
Попробовал : )
$id_con=mysql_connect("localhost","root","kdxsr"); 
$select_db=mysql_select_db("snab");
$query=mysql_query('SET NAMES UTF8 COLLATE utf8_general_ci');

Это я над дубликатом базы изголяюсь, если бы на сервере, все данные теперь в непонятных иероглифах выводит , :)))
но что интересно, там поиск по часовому поясу, селективный, там выводит нормально, читабельно.
Вобщем надо передахнуть, а то уже перепуталось все.
Завтра продолжу.
Спасибо БОЛЬШОЕ за помощь.

Спустя 17 часов, 39 минут, 28 секунд (19.04.2012 - 08:36) yok написал(а):
Я тут чуть почитал, о си, что то получается что при создании через пхпмой админ там можно указать сравнение, и именно это окончание ci , отвечает за поиск без учета регистра.
Я хочу попробовать (все через терминал конечно), создать базу, и как то сравнение это си чтоб на базу распространялось, а потом из дампа попробовать восстановить базу, или новую заведу.
Но нашел код только на таблицу
ALTER DATABASE `имя таблицы` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

но я должен сначала создать все таблицы и про каждую тогда это описать, но тогда данные уже не зальешь, код на данные не распространяется, читал.

Вобщем я сделал базу новую , на всю базу нельзя как то дать команду для создаваемых таблиц чтобы было это си.?

А вообще как узнать в какой кодировке моя база?

Спустя 54 минуты, 57 секунд (19.04.2012 - 09:31) ИНСИ написал(а):
Цитата
А вообще как узнать в какой кодировке моя база?

SHOW VARIABLES LIKE  "character_set_database"


Цитата
дать команду для создаваемых таблиц чтобы было это си

ALTER TABLE 'имя таблицы' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Спустя 18 минут, 16 секунд (19.04.2012 - 09:49) yok написал(а):
Пойду от начала. Спасибо.
mysql> use ci;
Database changed
mysql> alter database ci default character set utf8 collate utf_general_ci;
ERROR 1273 (HY000): Unknown collation: 'utf_general_ci'
mysql> alter database ci default character set utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.01 sec)

mysql> SHOW VARIABLES LIKE "character_set_database";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.01 sec)

mysql>


вот дела, это я верхний код при use ci;
потом вышел из мускула и только подключился и вот результат

[root@sunport ~]# mysql -u root -pkdxsr
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 77
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show variables like "character_set_database";
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.01 sec)

mysql>

вышел из терминала, опять подключился, хоть си база , хоть сразу уже латин1.
Это почему ?

Спустя 11 минут, 41 секунда (19.04.2012 - 10:01) yok написал(а):
А теперь уже все время латин, как получилось что было utf8 не понимаю.
mysql> alter database ci default character set utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.00 sec)

mysql> show variables like 'character_set_database';
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.00 sec)

mysql>

Спустя 2 минуты, 11 секунд (19.04.2012 - 10:03) ИНСИ написал(а):
Цитата
Unknown collation: 'utf_general_ci'

Вас это не напрягает? smile.gif

Цитата
alter database ci default character set utf8 collate utf_general_ci;

Вы забыли цифру 8 smile.gif

Спустя 5 минут, 50 секунд (19.04.2012 - 10:09) ИНСИ написал(а):
Цитата
alter database ci default character set utf8 collate utf8_general_ci;

Тогда уже введите команды:
ALTER TABLE 'имя таблицы' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER TABLE 'имя таблицы' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
ALTER DATABASE 'имя БД' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

Вы ведь меняете кодировку БД

Спустя 51 минута, 12 секунд (19.04.2012 - 11:00) yok написал(а):
Да, с цыфрой, то я не написал, следующий запрос уже был с цыфрой, просто копировал из териминала.
Вобщем пообедал , вернулся со свежей головой и понял где я ошибся.
Я же сделал новую базу ci и к ней апдейт применил до утф8, а потом же я к старой базе подключался или выше уровнем был, а там везде latin1
Поэтому и в замешательстве был, куда делась утф8 что я делал тут
alter database ci default character set utf8 collate utf8_general_ci;

все нормально, вот для снаб базы и си.
[root@sunport ~]# mysql -uroot -pkdxsr
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.77 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show variables like "character_set_database";
+
------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.01 sec)

mysql> use ci;
Database changed
mysql> show variables like
"character_set_database";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.01 sec)

mysql>use snab;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show variables like "
character_set_database";
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set (0.00 sec)

mysql> use ci;
Database changed
mysql> show variables like "
character_set_database";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.00 sec)

mysql>

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

Спустя 9 минут, 42 секунды (19.04.2012 - 11:10) yok написал(а):
Ну точно, на сервер такая же картина, там есть база и в ней есть поиск, и он работает как надо.
И она в ютф кодировке.
СПАСИБО ОГРОМНОЕ, теперь понятно откуда ноги растут.
СПАСИБО !!!!!!!!!!


Во я дурак, ну про сопроставление я не знал, но структуру таблицы ты мог посмотреть.
Раньше то смотрел, вобщем сделал таблицу и думаю посмотреть ее, а не помню как посмотреть таблицу. Но помню видел же, только через mysql> or mysqlshow
вобщем mysqlshow ci kontra -uroot -psssa
and all OK
in table has filed collation and it now in ci utf_general_ci
Вобщем отлично. Я почти уверен что будет работать поиск как надо, только вот еще прийдется с данными разобраться.

Спустя 44 минуты, 18 секунд (19.04.2012 - 11:54) ИНСИ написал(а):
yok ну вот smile.gif

Спустя 3 дня, 22 часа, 6 секунд (23.04.2012 - 09:54) yok написал(а):
Вобщем обрадовался я зря. Никак не хочет работать поиск без учета регистра.
Вот какой у меня вопрос, если снять дамп базы, то в файле дампа, вот такие каракули
INSERT INTO `kontra` VALUES (1,'РђРЎРђ РžРžРž','Р—Р»Р°С‚РѕСƒСЃС‚','Дишектош','РЎРјРёС€РЅРѕРІСƒ Р’.Рђ.','','РœРµРЅРµРґР¶РµС€','Р˜РіРѕС€СŒ Николаевич','',

там должны быть русские буквы.
(редактирую, посмотрел что в браузере, но тут уже P преобладает, в дампе преобладает D с черточкой на вертикальной)
И когда впервые просматрел снятый дамп, при том, что где только я не указывал вариаблы utf8, стояло в дампе вот как
CREATE TABLE `kontra` (
`id` mediumint(9) NOT NULL,
`kontora` varchar(120) default NULL,
......................................
`shift_color` varchar(30) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin;
SET character_set_client = @saved_cs_client;

чарсет латин, я обрадовался, заменил на утф, но увы, но уже ясно что с этим надо разобраться.
Просматривал дамп в KWRITE , кодировки такой там нет.
Вообще экспортировала в дамп mysqldump ci>ci.txt

Спустя 1 час, 19 минут, 59 секунд (23.04.2012 - 11:14) yok написал(а):
Короче понатыкал везде где тока можно утф8, и после подключения поставил set names utf8
усЁ впорядке, поиск идет без учета регистра. Теперь будет искать где лишнее я понатыкал и где достаточное.

Спустя 22 часа, 43 минуты, 28 секунд (24.04.2012 - 09:58) ИНСИ написал(а):
yok а файлам вы поменяли кодировку? У файлов тоже есть DOM кодировка, которую также надо менять.


_____________
Достучаться до небес.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.