При выводе из БД с установленном ENGINE=MyISAM DEFAULT CHARSET=utf8 , вместо ‘ш’ код utf8 первый байт = 209 второй байт 136 , выдаёт первый байт = 209 второй байт 63 =‘?’, проверено в версиях 5.0.7 (php 5.3.3) и 4.1.25 (php 4.4.9) под разными браузерами. Как с этим бороться?
Простейшая программа , показывающая эту ошибку
1. Pingvin - 19 Сентября, 2011 - 09:10:36 - перейти к сообщению
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 всё было и есть в норме, но заказчик попросил. Т.е. каждый раз надо делать настройку таблицы.
Всем спасибо.
С помощью 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.cfg
SET NAMES 'utf8'” вполне достаточно
Цитата:
Не на локальном (Денвер) не на удалённом серверах нет my.ini
значит есть my.cfg
7. Pingvin - 20 Сентября, 2011 - 19:06:35 - перейти к сообщению
caballero пишет:
При этом переменная character_set_server так и осталась в 1251, но может она и не нужна?
SET NAMES 'utf8'” вполне достаточно
8. caballero - 20 Сентября, 2011 - 20:43:56 - перейти к сообщению
не нужна
сервер и БД уже созданны в такой кодировке какая есть
нужно только set names указать в какой кодировке отдавать - перекодировть забота mysql
и может быть иногда нужно указать collation если с сортировкой будут проблеммы
сервер и БД уже созданны в такой кодировке какая есть
нужно только 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:
скопировать код в буфер обмена
скопировать код в буфер обмена
- function opred_codir_mysql() { // верная кодировка MySQL или не верная
- $sql = "SHOW CREATE TABLE `tovar`";
- foreach ($line as $col_value) {
- if (strstr($col_value,'Титановый')) {echo "$col_value<br>\n";return 1;} // echo добавлено для отладки
- }
- }
- }
- return 0;
- }
P.S. Убрал лишнее отрицание и if, всё равно прога работает с точностью до наоборот: при добавлении запроса SET NAMES 'utf8' функция возвращает 0, а иначе 1 .