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
Форумы портала PHP.SU :: Версия для печати :: Как бороться с ошибкой в MySQL
Форумы портала PHP.SU » » Кодировки и все смежное » Как бороться с ошибкой в MySQL

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

1. Pingvin - 19 Сентября, 2011 - 09:10:36 - перейти к сообщению
При выводе из БД с установленном ENGINE=MyISAM DEFAULT CHARSET=utf8 , вместо ‘ш’ код utf8 первый байт = 209 второй байт 136 , выдаёт первый байт = 209 второй байт 63 =‘?’, проверено в версиях 5.0.7 (php 5.3.3) и 4.1.25 (php 4.4.9) под разными браузерами. Как с этим бороться?
Простейшая программа , показывающая эту ошибку
2. caballero - 19 Сентября, 2011 - 09:59:15 - перейти к сообщению
a set names делали перед выполнением запросов?
3. Pingvin - 19 Сентября, 2011 - 14:33:47 - перейти к сообщению
Я нигде запрос mysql_query("SET NAMES 'utf8'"); не использовал. При использовании данного запроса, все русские символы кодируются : первый байт - 208 , а 161 - второй байт , а иначе кроме буквы ш, все как в блокноте.
4. Pingvin - 20 Сентября, 2011 - 11:58:23 - перейти к сообщению
Если в прогу добавлять запрос: "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 всё было и есть в норме, но заказчик попросил. Т.е. каждый раз надо делать настройку таблицы.
Всем спасибо.
5. Pingvin - 20 Сентября, 2011 - 15:52:05 - перейти к сообщению
Не на локальном (Денвер) не на удалённом серверах нет my.ini . Выполнил все 8 запросов, переписал БД, а то в ней тоже был код похожий на исходник utf8.
6. caballero - 20 Сентября, 2011 - 16:01:00 - перейти к сообщению
большинство из 8 запросов в вашем случае не имеют смысла
SET NAMES 'utf8'” вполне достаточно


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

значит есть my.cfg
7. Pingvin - 20 Сентября, 2011 - 19:06:35 - перейти к сообщению
caballero пишет:
SET NAMES 'utf8'” вполне достаточно
При этом переменная character_set_server так и осталась в 1251, но может она и не нужна?
8. caballero - 20 Сентября, 2011 - 20:43:56 - перейти к сообщению
не нужна

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

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

и может быть иногда нужно указать collation если с сортировкой будут проблеммы
9. Pingvin - 21 Сентября, 2011 - 18:28:26 - перейти к сообщению
caballero пишет:
SET NAMES 'utf8'” вполне достаточно

Добавил эту настройку в другой скрипт, который выдавал ерунду, теперь всё нормально. Спасибо
10. Pingvin - 21 Сентября, 2011 - 21:06:50 - перейти к сообщению
Я написал функцию для проверки кодировки БД (в структуре БД таблицы `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 .
11. caballero - 22 Сентября, 2011 - 01:02:19 - перейти к сообщению
Не парьте себе мозги
У сервера может быть одна кодировка у БД другая а у клиента БД третья а сами данные в четвертой а ось на которой сервер синстален в пятой
вы указываете как вам должны вернуть данные через set names
Остальное забота сервера и клиентских библиотек (драйвера)
12. Pingvin - 22 Сентября, 2011 - 09:05:08 - перейти к сообщению
caballero пишет:
Не парьте себе мозги

Не парить, значит - не парить.

 

Powered by ExBB FM 1.0 RC1