Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: phpMyAdmin и mysql.exe: разница в кодировках
 
 автор: Хулиган   (09.10.2009 в 11:58)   письмо автору
 
 

Здравствуйте.

Проблема с запросами, в которых есть кириллица:

set character_set_connection='cp1251';
set character_set_client='cp1251';
set character_set_results='cp1251';
SET NAMES cp1251;
SELECT code, product, count FROM `table2` WHERE category='Аккумуляторы';


Утилитка mysql возвращает empty set. Если убрать из запроса 'Аккумуляторы', то всё прекрасно.
А phpMyAdmin нормально отрабатывает запрос, даже без установки character_set_connection, character_set_client и character_set_results.

Как заставить mysql корректно воспринимать кириллицу в запросе?

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 12:06)   письмо автору
 
   для: Хулиган   (09.10.2009 в 11:58)
 

Вот ещё дополнение: после установки character_set_connection и иже с ним в cp1251 проверяю через mysqladmin переменные - они по-прежнему установлены в latin1. Не меняются.

  Ответить  
 
 автор: cheops   (09.10.2009 в 12:46)   письмо автору
 
   для: Хулиган   (09.10.2009 в 12:06)
 

Это кодировка соединения - она должна устанавливаться всякий раз при установки соединения между клиентом и сервером.

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 13:22)   письмо автору
 
   для: cheops   (09.10.2009 в 12:46)
 

это понятно, что кодировка соединения.
Почему она не меняется на 1251? Все время установлена в latin1. Хоть делай set character_set_connection хоть не делай.
Как её поменять?

  Ответить  
 
 автор: Trianon   (09.10.2009 в 13:44)   письмо автору
 
   для: Хулиган   (09.10.2009 в 13:22)
 

Вы хотите сказать, что последовательно выполняете
SET NAMES 'cp1251';
SHOW VARIABLES LIKE '%char%' ;

и видите latin1 в соответствующей строке?

А какая версия сервера?

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 14:09)   письмо автору
 
   для: Trianon   (09.10.2009 в 13:44)
 

именно.
Версия 5.1.32

  Ответить  
 
 автор: Trianon   (09.10.2009 в 15:10)   письмо автору
 
   для: Хулиган   (09.10.2009 в 14:09)
 

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

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 15:30)   письмо автору
 
   для: Trianon   (09.10.2009 в 15:10)
 

Поддержка всех кодировок (включая ср1251) присутствует. Вы не совсем внимательно прочли топик: кириллица прекрасно распознается и отображается в результатах запроса. Проблема в том, что в самом запросе (а не в результатах) кириллица не работает.
Например
SELECT * FROM`table1` WHERE category='Аккумуляторы'
трансформируется в
SELECT * FROM`table1` WHERE category='????????????'

  Ответить  
 
 автор: Trianon   (09.10.2009 в 15:38)   письмо автору
 
   для: Хулиган   (09.10.2009 в 15:30)
 

Я не очень понимаю, что значит "трансформируется" .
А кодировку самой консоли Вы сменили на 1251?
Или так и набираете в OEM codepage (которая 866 в русской windows)

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 15:53)   письмо автору
 
   для: Trianon   (09.10.2009 в 15:38)
 

ну ясно дело что кодировку панели сменил, я ведь вывод от select * from `table1`; нормально читаю.
О трансформации: я случайно внес ошибку в запрос, и получил сообщение, из которого видно следующее:
mysql> select * from `table2` wh ere category='Аккумуляторы' order by product asc;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version syntax to use near 'ere category='????????????' order by product asc' at line 1

Из этого сделал вывод, что до сервера вместо аккумуляторов доходят знаки вопроса.
Вот в чем собственно проблема

  Ответить  
 
 автор: Trianon   (09.10.2009 в 16:52)   письмо автору
 
   для: Хулиган   (09.10.2009 в 15:53)
 

>ну ясно дело что кодировку панели сменил, я ведь вывод от select * from `table1`; нормально читаю.
это ничего не значит.
Что выдает запрос SHOW VARIABLES LIKE '%char%' после SET CHARACTER SET 'cp1251' ?

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 17:39)   письмо автору
 
   для: Trianon   (09.10.2009 в 16:52)
 

запрос выдает latin1.

А проблему победил при помощи параметра --default-character-set при коннекте
Всё вроде сейчас нормально.

  Ответить  
 
 автор: Trianon   (09.10.2009 в 18:00)   письмо автору
 
   для: Хулиган   (09.10.2009 в 17:39)
 

Запрос не выдает latin1 просто в силу того, что этот запрос выдает несколько строк.

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 18:33)   письмо автору
 
   для: Trianon   (09.10.2009 в 18:00)
 

это я для краткости написал latin1.
Интересующие меня character_set_client, character_set_results, character_set_connection стоят в латин.

  Ответить  
 
 автор: Trianon   (09.10.2009 в 18:45)   письмо автору
 
   для: Хулиган   (09.10.2009 в 17:39)
 

может у Вас сервер запущен с параметром --skip-character-set-client-handshake ?

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 22:23)   письмо автору
 
   для: Trianon   (09.10.2009 в 18:45)
 

Да черт его знает, как оно там запускается.
Просто сделал батник, в нем net start MySQL и всё.
Может где-то в каком-то конфиге прописано что-то не так. Не знаю.
Главное, понял как устранить, хотя и не нашёл первопричину, которую просто нет времени искать и разбираться.

  Ответить  
 
 автор: cheops   (09.10.2009 в 12:12)   письмо автору
 
   для: Хулиган   (09.10.2009 в 11:58)
 

Если речь идет об утилите mysql, необходимо перед её запуском сменить кодировку командной строки при помощи команды (при этом вместо точечных шрифтов, не поддерживающих кирилицу, необходимо выбрать Lucida Console)
chcp 1251

После запуска mysql, необходимо выполнить запрос
SET NAMES cp1251;

  Ответить  
 
 автор: Хулиган   (09.10.2009 в 12:22)   письмо автору
 
   для: cheops   (09.10.2009 в 12:12)
 

С выводом всё нормально. SELECT * FROM `table1` выводит всё в читабельном виде. С нормальной кириллицей.
Проблема возникает, если в запросе кириллица. Возвращается пустой результат.

mysql> select * from `table1` where category='Аккумуляторы';
Empty set (0.00 sec)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования