Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как бороться с ошибкой в MySQL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Pingvin
Отправлено: 19 Сентября, 2011 - 09:10:36
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




При выводе из БД с установленном ENGINE=MyISAM DEFAULT CHARSET=utf8 , вместо ‘ш’ код utf8 первый байт = 209 второй байт 136 , выдаёт первый байт = 209 второй байт 63 =‘?’, проверено в версиях 5.0.7 (php 5.3.3) и 4.1.25 (php 4.4.9) под разными браузерами. Как с этим бороться?
Простейшая программа , показывающая эту ошибку

(Отредактировано автором: 19 Сентября, 2011 - 15:26:20)

 
 Top
caballero
Отправлено: 19 Сентября, 2011 - 09:59:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




a set names делали перед выполнением запросов?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Pingvin
Отправлено: 19 Сентября, 2011 - 14:33:47
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




Я нигде запрос mysql_query("SET NAMES 'utf8'"); не использовал. При использовании данного запроса, все русские символы кодируются : первый байт - 208 , а 161 - второй байт , а иначе кроме буквы ш, все как в блокноте.

(Отредактировано автором: 19 Сентября, 2011 - 17:25:00)

 
 Top
Pingvin
Отправлено: 20 Сентября, 2011 - 11:58:23
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




Если в прогу добавлять запрос: "SET NAMES 'utf8'” или 8 запросов (в первый раз): "set character_set_client='utf8'"; “set character_set_connection='utf8'";"set character_set_results='utf8'";"set character_set_database='utf8'"; "set character_set_server='utf8'"; "set collation_connection='utf8_general_ci'"; "set collation_database='utf8_general_ci'"; “set collation_server='utf8_general_ci'" – делающие все переменные character_set_... и collation_... отличными от 'utf8’ ими самыми. То русские символы кодируются : первый байт - 208 , а 161 - второй байт , а иначе кроме буквы ш как в блокноте. После второго запуска (запросы были впереди программы) 8 запросов (после убирания 8 запросов, опять портится), переменные все полученные по запросам "SHOW VARIABLES LIKE '%collat%'" и "SHOW VARIABLES LIKE '%char%'" становятся нормальными (с utf8), и буква ш стала нормально выводится.

С помощью phpmyadmin сейчас нормальный вид, а с помощью специально написанной программы, которая в 1251 кодировке нормально работала, раньше была вместо ш - ерунда. Кстати в кодировке 1251 всё было и есть в норме, но заказчик попросил. Т.е. каждый раз надо делать настройку таблицы.
Всем спасибо.
 
 Top
Pingvin
Отправлено: 20 Сентября, 2011 - 15:52:05
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




Не на локальном (Денвер) не на удалённом серверах нет my.ini . Выполнил все 8 запросов, переписал БД, а то в ней тоже был код похожий на исходник utf8.
 
 Top
caballero
Отправлено: 20 Сентября, 2011 - 16:01:00
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




большинство из 8 запросов в вашем случае не имеют смысла
SET NAMES 'utf8'” вполне достаточно


Цитата:
Не на локальном (Денвер) не на удалённом серверах нет my.ini

значит есть my.cfg


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Pingvin
Отправлено: 20 Сентября, 2011 - 19:06:35
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




caballero пишет:
SET NAMES 'utf8'” вполне достаточно
При этом переменная character_set_server так и осталась в 1251, но может она и не нужна?
 
 Top
caballero
Отправлено: 20 Сентября, 2011 - 20:43:56
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




не нужна

сервер и БД уже созданны в такой кодировке какая есть

нужно только set names указать в какой кодировке отдавать - перекодировть забота mysql

и может быть иногда нужно указать collation если с сортировкой будут проблеммы


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Pingvin
Отправлено: 21 Сентября, 2011 - 18:28:26
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




caballero пишет:
SET NAMES 'utf8'” вполне достаточно

Добавил эту настройку в другой скрипт, который выдавал ерунду, теперь всё нормально. Спасибо
 
 Top
Pingvin
Отправлено: 21 Сентября, 2011 - 21:06:50
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




Я написал функцию для проверки кодировки БД (в структуре БД таблицы `tovar` после SET есть русские символы), а она всегда говорит, что кодировка нормальная и выводит соответственно правильно, хотя в БД исходник UTF8 (в браузере стоит кодировка UTF8)), что я делаю не так?
PHP:
скопировать код в буфер обмена
  1. function opred_codir_mysql()    { // верная кодировка MySQL или не верная
  2.         $sql = "SHOW CREATE TABLE `tovar`";
  3.         $result=mysql_query($sql);
  4.         if (MYSQL_NUM_ROWS($result))    {
  5.                 while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
  6.                         foreach ($line as $col_value)   {
  7.                                 if (strstr($col_value,'Титановый')) {echo "$col_value<br>\n";return 1;} // echo добавлено для отладки
  8.                                                                                         }
  9.                                                                                                                                 }
  10.                                                                         }
  11.         return 0;
  12.                                                                 }

P.S. Убрал лишнее отрицание и if, всё равно прога работает с точностью до наоборот: при добавлении запроса SET NAMES 'utf8' функция возвращает 0, а иначе 1 .

(Отредактировано автором: 21 Сентября, 2011 - 21:47:04)

 
 Top
caballero
Отправлено: 22 Сентября, 2011 - 01:02:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Не парьте себе мозги
У сервера может быть одна кодировка у БД другая а у клиента БД третья а сами данные в четвертой а ось на которой сервер синстален в пятой
вы указываете как вам должны вернуть данные через set names
Остальное забота сервера и клиентских библиотек (драйвера)


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Pingvin
Отправлено: 22 Сентября, 2011 - 09:05:08
Post Id



Новичок


Покинул форум
Сообщений всего: 15
Дата рег-ции: Сент. 2011  
Откуда: Пенза


Помог: 0 раз(а)




caballero пишет:
Не парьте себе мозги

Не парить, значит - не парить.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB