Просмотр полной версии : LIKE в SQL
Hammaga salom!
php da
$q="select * from `boys` where `name` LIKE '$letter%' order by name";
zaprosi agar $letter rus harfi bo'lsa, notog'ri ishlayapti. To'g'ri ishlash uchun nima qilish kerak?
Raxmat!
Если у базы или соединения стоит нерусский (некириллический) collation - будут глюки. Попробуйте юзать utf8_general_ci.
Mustread: Проблемы с русскими буквами в Mysql 4.1 (http://phpclub.ru/faq/Mysql41Rus)
Rustam Khamidov
29.04.2008, 23:30
php da
$q="select * from `boys` where `name` LIKE '$letter%' order by name";
zaprosi agar $letter rus harfi bo'lsa, notog'ri ishlayapti. To'g'ri ishlash uchun nima qilish kerak?
Raxmat!
при этом если делается выборка без Like русские отображаются корректно?
какая версия MySQL, какая кодировка по умолчанию в MySQL и какая кодировка на странице ввода запросов?
MySQL - 4.0.21;
charset по умолчанию не знаю какой;
кодировка на странице ввода запросов - windows-1251;
И пробовал запрос "SET NAMES cp1251", все равно не помогло.
Если $letter - английская буква, тогда в результате появляется и русские слова.
Кароче, запрос дадут ожидаемый список и плюс этого не нужные результаты.
Rustam Khamidov
30.04.2008, 10:14
не достаточно исходной информации. Пожалуйста дайте из php скрипта запрос в mysql
$q="SHOW VARIABLES";
и покажите результат.
Тогда смогу сказать в чем причина.
Variable_name Value
back_log 50
basedir c:\apachefriends\xampp\mysql\
bdb_cache_size 8388572
bdb_log_buffer_size 32768
bdb_home c:\apachefriends\xampp\mysql\data\
bdb_max_lock 10000
bdb_logdir
bdb_shared_data OFF
bdb_tmpdir c:\apachefriends\xampp\tmp\
bdb_version Sleepycat Software: Berkeley DB 3.2.9a: (September...
binlog_cache_size 32768
bulk_insert_buffer_size 8388608
character_set latin1
character_sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis...
concurrent_insert ON
connect_timeout 5
convert_character_set
datadir c:\apachefriends\xampp\mysql\data\
default_week_format 0
delay_key_write ON
delayed_insert_limit 100
delayed_insert_timeout 300
delayed_queue_size 1000
flush OFF
flush_time 1800
ft_boolean_syntax + -><()~*:""&|
ft_min_word_len 4
ft_max_word_len 254
ft_max_word_len_for_sort 20
ft_stopword_file (built-in)
have_bdb YES
have_crypt NO
have_innodb DISABLED
have_isam YES
have_raid NO
have_symlink YES
have_openssl NO
have_query_cache YES
init_file
innodb_additional_mem_pool_size 1048576
innodb_buffer_pool_size 8388608
innodb_data_file_path
innodb_data_home_dir
innodb_file_io_threads 4
innodb_force_recovery 0
innodb_thread_concurrency 8
innodb_flush_log_at_trx_commit 1
innodb_fast_shutdown ON
innodb_flush_method
innodb_lock_wait_timeout 50
innodb_log_arch_dir
innodb_log_archive OFF
innodb_log_buffer_size 1048576
innodb_log_file_size 5242880
innodb_log_files_in_group 2
innodb_log_group_home_dir
innodb_mirrored_log_groups 1
innodb_max_dirty_pages_pct 90
interactive_timeout 28800
join_buffer_size 131072
key_buffer_size 16777216
language c:\apachefriends\xampp\mysql\share\english\
large_files_support ON
license GPL
local_infile ON
log OFF
log_update OFF
log_bin ON
log_slave_updates OFF
log_slow_queries OFF
log_warnings 1
long_query_time 10
low_priority_updates OFF
lower_case_file_system OFF
lower_case_table_names 1
max_allowed_packet 1047552
max_binlog_cache_size 4294967295
max_binlog_size 1073741824
max_connections 100
max_connect_errors 10
max_delayed_threads 20
max_insert_delayed_threads 20
max_heap_table_size 16777216
max_join_size 4294967295
max_relay_log_size 0
max_seeks_for_key 4294967295
max_sort_length 1024
max_user_connections 0
max_tmp_tables 32
max_write_lock_count 4294967295
myisam_max_extra_sort_file_size 268435456
myisam_max_sort_file_size 2147483647
myisam_repair_threads 1
myisam_recover_options OFF
myisam_sort_buffer_size 8388608
net_buffer_length 8192
net_read_timeout 30
net_retry_count 10
net_write_timeout 60
new OFF
Variable_name Value
open_files_limit 0
pid_file c:\apachefriends\xampp\mysql\data\files.pid
log_error .\files.err
port 3306
protocol_version 10
query_alloc_block_size 8192
query_cache_limit 1048576
query_cache_size 0
query_cache_type ON
query_prealloc_size 8192
range_alloc_block_size 2048
read_buffer_size 131072
read_only OFF
read_rnd_buffer_size 262144
rpl_recovery_rank 0
server_id 1
slave_net_timeout 3600
skip_external_locking ON
skip_networking OFF
skip_show_database OFF
slow_launch_time 2
sort_buffer_size 524252
sql_mode 0
table_cache 64
table_type MYISAM
thread_cache_size 0
thread_stack 196608
tx_isolation REPEATABLE-READ
timezone Северная Центр. Азия (зима)
tmp_table_size 33554432
tmpdir c:\apachefriends\xampp\tmp\
transaction_alloc_block_size 8192
transaction_prealloc_size 4096
version 4.0.21-debug-log
version_comment Source distribution
version_compile_os Win95/Win98
wait_timeout 28800
Rustam Khamidov
30.04.2008, 12:12
Чарсет по умолчанию у Вас
character_set latin1
Два способа решения.
1. Необходимо после каждого коннекта к базе данных (mysql_connect) сразу 1 раз выполнять $q="SET NAMES CP1251", после вы можете делать выборки и вставки сколько угодно раз.
проверьте свою присланную строку на наличие кодировки cp1251
character_sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis...
В этом решении те данные которые уже есть в базе нужно ввести по новому, потому как их вносили без указания SET NAMES. Нверняка, именно поэтому у Вас не срабатывало эта команда ранее.
2. Вариант. Насколько видно у вас на винде mysql сервер
если это ваш персональный сервер (а не хостинг провайдера), то в файле конфигурации сервера my.cnf отредактируйте и клиентский и серверный раздел строки
default-character-set=cp1251
В этом случае в php скриптах ничего править не надо.
2 Rustam Khamidov
1st 10x very much.
Я отредактировал my.conf как Вы сказали. И все работало нормально. Но я сомневаюсь, что на хостере кодировка cp1251. Я хотел бы сделать это через пхп(проблема не будеть с хостерами). Но почему то не работает запрос $q="SET NAMES CP1251" :(.
А у базы все-таки какой collation? по умолчанию часто ставится western-чего-то там. который с русскими буквами работает некорректно
Rustam Khamidov
30.04.2008, 13:25
Но я сомневаюсь, что на хостере кодировка cp1251. Я хотел бы сделать это через пхп(проблема не будеть с хостерами). Но почему то не работает запрос $q="SET NAMES CP1251" :(.
о! извините, я ошибся в синтаксисе
$q="SET NAMES 'WIN1251'";
или
$q="SET NAMES 'CP1251'";
Rustam Khamidov
30.04.2008, 13:39
А у базы все-таки какой collation? по умолчанию часто ставится western-чего-то там. который с русскими буквами работает некорректно
по умолчанию latin1_swedish_ci
использование SET NAMES 'x' это эквивалент трех команд
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
Опционально можно использовать синтаксис
SET NAMES 'charset_name' COLLATE 'collation_name'
Для collation есть также команда
SET CHARACTER SET x
это эквивалент следующих трех команд
SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
В данном случае (используя cp1251) если писать SET NAMES 'cp1251' то collation установится правильно. Можете проверить SHOW CHARACTER SET; какой стоит по умолчанию collation для cp1251 - cp1251_general_ci
latin1_swedish_ci
Ага, точно... что-то вертелось такое на уме сильно западное )
Rustam Khamidov
30.04.2008, 13:45
Для просмотра текущего collation можете использовать
SHOW COLLATION
в результате по колонке Default можно увидеть что у Вас стоит.
!!! Но в данном случае эта функция неприменима, ввиду того что версия у Elf стоит 4.0.х
а эта функция поддерживается только начиная с MySQL 4.1.0
о! извините, я ошибся в синтаксисе
$q="SET NAMES 'WIN1251'";
или
$q="SET NAMES 'CP1251'";
Нет, я набрал 2 варианты, все равно не работает.
Может быть, у вас в mysql не установлены нужные кодировки? И вообще, оно, что, под Win 9X собрано и работает???
Rustam Khamidov
30.04.2008, 13:54
$q="SET NAMES 'CP1251'";
Нет, я набрал 2 варианты, все равно не работает.
а что возвращает исполнение этой команды?
Rustam Khamidov
30.04.2008, 14:05
Как возможный вариант просмотрите еще раз внимательно результат SHOW VARIABLES
строку которая начинается
character_sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis...
Есть ли там в перечислении cp1251?
Если нет, то эта кодировка в этой конкретной сборке MySQL не поддерживается.
Как возможный вариант просмотрите еще раз внимательно результат SHOW VARIABLES
строку которая начинается
character_sets latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis...
Есть ли там в перечислении cp1251?
Если нет, то эта кодировка в этой конкретной сборке MySQL не поддерживается.
Там есть cp1231 и win1251.
Rustam Khamidov
30.04.2008, 15:08
Там есть cp1231 и win1251.
тогда создайте пожалуйста новый файл setnamestest.php со следующим содержимым
<?php
$dbserver = '127.0.0.1';
$dbuser = 'DBUSERNAME';
$dbpass = 'DBPASSWORD';
$dbname = 'DBNAME';
error_reporting(E_ALL);
$db = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $db);
$q = "SET NAMES 'CP1251'";
$result = mysql_query($q) or die("Invalid query: " mysql_error());
?>
заполните свои имя, пароль и наименование бд. Разместите у себя на хостинге. И потом сообщите либо URL для вызова, либо покажите результат (result html source).
2 Ruatam Khamidov
Result:
Invalid query: Unknown system variable 'names'
Rustam Khamidov
30.04.2008, 17:28
2 Ruatam Khamidov
Result:
Invalid query: Unknown system variable 'names'
К сожалению нет возможности слить такую же версию MySQL как у Вас (эта версия сообществом уже не поддерживается, минимум 4.1.х).
Но проверьте не у себя локально, а на своем хостинг провайдере, ибо у хостинг провайдеров версии намного свежее. А для локальной проверки всё-таки лучше проапгрейдить... хотя бы до 4.1.
P.S. Я посмотрю вечером дома, для старых версий решение, возможно изменился синаксис, но на mysql.com эта дока уже не доступна.
Rustam Khamidov
01.05.2008, 00:03
Посмотрел changelog для MySQL... Заменитель трех команд (SET NAMES) ввели достаточно поздно, а баги исправляли в нескольких версиях 4.1.x
Поэтому если версия сервера ниже 4.1.0, то лучше использовать прямое обращение. Тот скрипт, который я приводил работает на версиях 4.1 и выше. Если версия ниже (как у Вас) протестируте следующий скрипт
<?php
$dbserver = '127.0.0.1';
$dbuser = 'DBUSERNAME';
$dbpass = 'DBPASSWORD';
$dbname = 'DBNAME';
error_reporting(E_ALL);
$db = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $db);
$q = "SET SESSION character_set_client = 'cp1251'";
$result = mysql_query($q) or die("Invalid query: " . mysql_error());
$q = "SET SESSION character_set_results = 'cp1251'";
$result = mysql_query($q) or die("Invalid query: " . mysql_error());
$q = "SET SESSION character_set_connection = 'cp1251'";
$result = mysql_query($q) or die("Invalid query: " . mysql_error());
print "Character session variables sucess updated.";
?>
Если сработает тогда придется после каждого коннекта к серверу использовать вместо "SET NAMES" его трехстрочную составляющую.
Rustam Khamidov
01.05.2008, 00:35
Начиная с MySQL 4.0.3 были изменен синтаксис команды SET для изменения серверных значений на лету (добавления опций GLOBAL|SESSION), но для изменения глобальных переменных нужно обладать правами суперпользователя mysql, а на хостинге у Вас такой возможности не будет. Поэтому рекомендую использовать в виде SESSION как в примере, но недостаток, что нужно вызывать эти команды при создании каждого нового подключения.
Примечание1: Алиасом для опции SESSION является LOCAL.
Примечание2: Если не указывать GLOBAL|SESSION|LOCAL, то по умолчанию должно использоваться SESSION, но я не уверен, что в некоторых версиях возможны баги *)
В более древних версиях (ниже 4.0.3) вместо ключевого слова SET необходимо использовать SET OPTION, но начиная с этой версии и выше этот синтаксис устарел.
Т.е. для версий 3.22 > version < 4.0.3 используйте три команды SET OPTION ...
для версий 4.0.3 >= version < 4.1.x используйте три команды SET SESSION ...
а для версий >= 4.1.0 можно использовать только одну команду SET NAMES ...
2 Rustam Khamidov:
Спасибо за помощь! Я обновил MySQL на версию 4.1.8-max. Теперь все работает в норме :).
На MySQL сервере кодировка по умолчанию cp1251. И в phpmyadmin все записи видно прекрасно. Но когда я запускаю сайт, все кодировки испортиться. Я решил эту проблему через set names "cp1251". Вот эту проблему можно решать где-нибудь в настройке?
Еще одинь вопрос: на хостинге стоит кодировка mysql latin1_swedish_ci. А на моем локальном стоит кодировка cp1251. При экспорте на хостинг через phpmyadmin все кодировка испортится. Как решить эту проблему?
Aleksey Kim
03.07.2008, 12:53
Еще одинь вопрос: на хостинге стоит кодировка mysql latin1_swedish_ci. А на моем локальном стоит кодировка cp1251. При экспорте на хостинг через phpmyadmin все кодировка испортится. Как решить эту проблему?
iconv (http://www.php.net/manual/ru/function.iconv.php) :187:
Там есть cp1231 и win1251.
тогда создайте пожалуйста новый файл setnamestest.php со следующим содержимым
<?php
$dbserver = '127.0.0.1';
$dbuser = 'DBUSERNAME';
$dbpass = 'DBPASSWORD';
$dbname = 'DBNAME';
error_reporting(E_ALL);
$db = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $db);
$q = "SET NAMES 'CP1251'";
$result = mysql_query($q) or die("Invalid query: " mysql_error());
?>
заполните свои имя, пароль и наименование бд. Разместите у себя на хостинге. И потом сообщите либо URL для вызова, либо покажите результат (result html source).
Все ок ))
Если у базы или соединения стоит нерусский (некириллический) collation - будут глюки. Попробуйте юзать utf8_general_ci.
Это есть правильный ответ!!!
JackDaniels
15.06.2013, 00:52
windows-1251
Давно уже пора перейти на UTF-8 везде и всюду.
Давно уже пора перейти на UTF-8 везде и всюду.Конечно. Ведь 5 лет прошло :)
vBulletin® v3.8.5, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot