1 (изменено: Dima, 2007-12-12 19:06:32)

Тема: Опять русские буквы.

Вот такая проблема. База в UTF-8. Скриптом заполняю таблицу через форму, потом вывожу ее. В браузере все нормально (кодировка UTF-8).  Как только открываю таблицу PHPMyAdmin'ом вместо русских букв получаю что-то вроде этого - тест
Дальше - больше. Заполняю таблицу в PHPMyAdmin, в нем все нормально отображается, но при выводе скриптом, получаю вопросики. Переключаю в браузере кодировку на Windows-1251 - получаю нормальный текст. Получается что каким-то .... PHPMyAdmin сохраняет и выбирает данные в Win кодировке?

Переменные окружения:

SHOW VARIABLES LIKE 'collation%';
collation_connection      utf8_general_ci
collation_database     utf8_general_ci
collation_server     utf8_general_ci

SHOW VARIABLES LIKE 'character%';
character_set_client      utf8
character_set_connection     utf8
character_set_database     utf8
character_set_filesystem     binary
character_set_results     utf8
character_set_server     utf8
character_set_system     utf8

Бьюсь с этим уже третий день. Что-то менять в конфигурации MySQL не могу - т.к. хостинг не мой.
Помогите плиз, а то мозг уже вытекает через уши sad

P.S. Версия MySQL 5.0.45, phpMyAdmin - 2.11.3

2

Re: Опять русские буквы.

Dima
Попробуйте сразу после подключения к MySQL выполнить запрос "SET NAMES кодировка", в вашем случае:
SET NAMES utf8
Это надо добавить в скрипт.

Таблицы тоже должны иметь кодировку utf8.

3

Re: Опять русские буквы.

Hanut большое спасибо! Помогло. Вот только не совсем понимаю что там происходило. Ведь когда в скрипте не было 'SET NAMES utf8', данные сохранялись и скриптом отображались sad

4

Re: Опять русские буквы.

Dima
Точно сказать не могу, но предполагаю, что в настройках MySQL использована директива:
skip-character-set-client-handshake
Либо:
init-connect="SET NAMES cp1251"

Таким образом все отправляемые или принимаемые данные (если не задан SET NAMES) MySQL принимает как cp1251.
Скрипт отправляет данные в utf8, но БД принимает их, как cp1251, из-за чего при просмотре в phpMyAdmin они отображаются крякозябами. Далее при выборке скрипт опять выбирает данные как cp1251 и из-за того что страница отображается в utf8, данные видны без ошибок.

Предупреждаю, что дамп содержащим данные в utf8 сохраненными как cp1251, вернуть кодировку может быть очень сложно, не говоря о том, что оперировать таким дампом будет нельзя.

5

Re: Опять русские буквы.

у меня похожая проблема:
MySQL-кодировка:  UTF-8 Unicode (utf8)
Сопоставление соединения с MySQL: utf8_bin
таблица в utf8_bin
в ПМА отображается всё корректно, без всяких там знаков вопросов и прочих иероглифов. Но при выполнении скрипта в браузере показываются знаки вопросов вместо определенных символов. Например: Langv?r Tandheelkundig Centrum, G F H вместо Langv?r Tandheelkundig Centrum, G F H
З.Ы. скрипт и дамп базы могу выслать

6

Re: Опять русские буквы.

- таблица
- скрипт
____________

Hanut: Файлы взял, удалите их с Рапиды.

7

Re: Опять русские буквы.

В файл index.php, сразу после функции mysql_connect попробуйте добавить строку:
mysql_query('SET NAMES utf8') or exit('SET NAMES Error');

Еще один момент - используйте специализированный текстовый редактор для создания скриптов, который позволяет сохранять файлы в кодировке utf8 без BOM, например Notepad++ или PHP Expert Editor. Также обратите внимание, что скрипт находится в ANSI кодировке, хотя должен быть в utf8.

8

Re: Опять русские буквы.

пользуюсь PHP Expert Editor'ом, как в нём поменять кодировку?? Наверное проблема именно в кодировке скрипта

9

Re: Опять русские буквы.

JJ bOUN
File -> Encoding
Или в статусной строке кликните на текущую кодировку.

10

Re: Опять русские буквы.

Hanut
ААААААААА!!!!!!!!!!!!!!!!!! ТЫ СУПЕР!!!!!!!!!!! СПАСИБО!!!!!!!!!!!!!!!!!! коротко и ясно! а мучался с этим долго блин... ПАСИБА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P.S. даж зарегался чтоб паблагадарить)ГГГГггг

Сообщение добавлено Thu Jan 15 00:19:33 2009
- - - - добавлено

кстати, а сожно написать например так:
mysql_query("SET NAMES `utf8`") or die(sysmass('Ошибка в кодировке БД.'));
???ммммммм?)
и при каких условиях может возникнуть эта ошибка?)

11

Re: Опять русские буквы.

ExtendedPlay
Написать можно, наверное, я же не знаю что такое sysmass().
Ошибка может вылезти в очень старых версиях MySQL, но в наше время таких уже не найти, к счастью. По сути, or die() - лишнее.

12

Re: Опять русские буквы.

Hanut
Ну я так и думал) пасиба) очень помог)

13 (изменено: ekonomizer, 2011-09-08 16:37:18)

Re: Опять русские буквы.

Подниму вопрос.
Пожалуйста подскажите!!! Что делать не заню:(
Через скрипт заношу данные(кирилица) в БД в ПМА вижу какозябры.

Использую Denwer.
MySQL-кодировка: UTF-8 Unicode (utf8)
Кодировка таблиц UTF8 general ci

скрипт в кодировке utf8 без BOM
в корне сайта лежит .httpaccess с PHP_VALUE default_charset utf-8
сам скрипт:

// Подключение к БД.
mysql_connect(DB_HOST, DB_LOGIN, DB_PASSWORD) or die('No connect with data base');
mysql_set_charset('utf8');
mysql_query('SET NAMES utf8');
mysql_select_db(DB_NAME) or die('No data base');

// Запрос через ПДО и сервис MSQL.php.
$msql = MSQL::Instance();
$session['name_area'] = 'иван';               
$msql->Insert('areas', $session);

Вроде воткнул уже все что можно:) Но в ПМА бяки, на экран из БД выводит все ок.
Помогите пожалуйста!

14

Re: Опять русские буквы.

ekonomizer сказал:

Вроде воткнул уже все что можно:) Но в ПМА бяки, на экран из БД выводит все ок.

Думаю осталось только одно - поменять пользователя MySQL. Если вы подключаетесь под root, то установка кодировки соединения с MySQL игнорируется и данные все равно идут в latin1, поэтому необходимо завести отдельного пользователя и наделить его только необходимыми правами на используемую базу данных. Для нового пользователя нельзя выбирать права из раздела "Администрирование".

Что такое MSQL.php я даже не знаю.

15

Re: Опять русские буквы.

Создаю пользователя:
Захожу в привилегии, добавить нового пользователя, задаю имя хост пароль, не создаю для него специальную базу данных, в глобальные привилегиях выбираю данные - INSERT, структура - ALTER, ограничение внизу оставляю по умолч. нулями, жму создать пользователя.
Далее запускаю срипт.
Если запускать без функц. mysql_set_charset('utf8'); и выводить потом кодировку то выводит Latin1.
Если mysql_set_charset('utf8') включить то кодировка utf8

Но на результат это ни как не влияет в таблице все равно бяки.
Там не нужно как то специально задавать права для определенной таблицы может в этом дело?

16

Re: Опять русские буквы.

Вы все делаете правильно. Покажите конфигурационный файл MySQL (my.cnf или my.ini).

17 (изменено: ekonomizer, 2011-09-08 21:47:57)

Re: Опять русские буквы.

# +-------------------------------------------------------------------------+
# | Джентльменский набор Web-разработчика                                   |
# | Версия: Денвер-3 2010-11-07                                             |
# +-------------------------------------------------------------------------+
# | Copyright (C) 2001-2010 Дмитрий Котеров.                                |
# +-------------------------------------------------------------------------+
# | Данный файл является частью комплекса программ "Денвер-3". Вы не можете |
# | использовать  его в коммерческих  целях.  Никакие другие ограничения не |
# | накладываются.  Если вы хотите внести изменения в исходный код,  авторы |
# | будут рады получить от вас комментарии и замечания. Приятной работы!    |
# +-------------------------------------------------------------------------+
# | Домашняя страница: http://denwer.ru                                     |
# | Контакты: http://forum.dklab.ru/denwer                                  |
# +-------------------------------------------------------------------------+
##
## Конфигурация MySQL, не очень требовательная к системным ресурсам.
##

#
# Следующие параметры будут переданы всем клиентским программам
# (например, mysql.exe). ВНИМАНИЕ: если не сработает, укажите
# путь к my.cnf ЯВНО, например:
# 
# mysql.exe --defaults-file=/usr/local/mysql-5.1/my.cnf ...
#
[client]
port                  = 3306
socket                = /tmp/mysql5.sock
default-character-set = cp1251
character-sets-dir    = /usr/local/mysql-5.1/share/charsets


#
# Параметры MySQL-сервера.
#
[mysqld]
# Кодировка баз данных по умолчанию.
default-character-set = cp1251
init-connect = "set names cp1251"
skip-character-set-client-handshake

# Временная директория.
tmpdir                = /tmp

#
# Обработывать запросы ТОЛЬКО с локальной машины (повышает безопасность).
# Если вы хотите, чтобы MySQL-сервер был доступен из сети,
# уберите следующую ниже директиву.
#
bind-address          = 127.0.0.1

# Порт сервера.
port                  = 3306
socket                = /tmp/mysql5.sock

lower-case-table-names = 2

# Различные настройки, оптимизированные для небольшого объема памяти.
skip-locking
key_buffer            = 16K
max_allowed_packet    = 1M
table_cache           = 4
sort_buffer_size      = 64K
read_buffer_size      = 256K
read_rnd_buffer_size  = 256K
net_buffer_length     = 2K
thread_stack          = 128K

#
# Вообще не слушать TCP/IP порт. Это может служить для усиления 
# безопасности, если все процессы, работающие с демоном MySQL, запущены
# на том же хосте. Однако при этом всё взаимодействие может проиходить
# ТОЛЬКО через сокеты Unix или именованные каналы Windows (доступны лишь
# в NT-версиях, при использовании mysqld-nt или mysqld-max-nt). Если 
# в Windows при этом НЕ включить опцию  "enable-named-pipe", демон MySQL 
# станет бесполезен

#skip-networking

# См. коментарий выше
#enable-named-pipe

# Server ID.
server-id = 1

# Раскомментируйте для журналирования UPDATE-запросов
#log-bin

#
# Раскомментируйте следующие строки, если вы хотите изменить
# настройки InnoDB по умолчанию.
#
#innodb_data_home_dir = /usr/local/mysql-5.1/var/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /usr/local/mysql-5.1/var/
#innodb_log_arch_dir = /usr/local/mysql-5.1/var/
# Вы можете установить .._buffer_pool_size размером до 50 - 80 %
# оперативной памяти, но опасайтесь перерасхода
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Устанавливайте .._log_file_size to 25 % от _buffer_pool_size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit=1
#innodb_lock_wait_timeout = 50


[mysqldump]
quick
max_allowed_packet = 16M


[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates


[isamchk]
key_buffer = 8M
sort_buffer_size = 8M


[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M


[mysqlhotcopy]
interactive-timeout

18

Re: Опять русские буквы.

Эти две строки поправьте на utf8, если не собираетесь использовать кодировку windows-1251.

default-character-set = utf8
init-connect = "set names utf8"

Эту строку надо удалить, она мешает установке кодировки соединения через запрос SET NAMES в скрипте.

skip-character-set-client-handshake

19 (изменено: ekonomizer, 2011-09-09 20:03:50)

Re: Опять русские буквы.

Спасибо!
Но к сожалению и это не помогло...

20

Re: Опять русские буквы.

ekonomizer сказал:

Спасибо!
Но к сожалению и это не помогло...

Значит проблема в классе MSQL.php. Попробуйте написать запрос на вставку данных и выполнить его функцией mysql_query().

21 (изменено: ekonomizer, 2011-09-10 09:54:22)

Re: Опять русские буквы.

Нашел решение - почему то не работал SET NAMES

mysql_query("SET CHARSET utf8");
mysql_query ("SET COLLATION_CONNECTION=utf8");
mysql_query("SET CHARACTER_SET_CLIENT=utf8");
mysql_query("SET CHARACTER_SET_RESULTS=utf8");

22

Re: Опять русские буквы.

У меня такая же проблема как у автора. В браузере при сохранении и выводе все нормально, но в phpMyAdmin кракозяблы.
Добавил в скрипты загрузки и отображения строку
mysqli_query($mysql_link, 'SET NAMES utf8');
Теперь в везде все ок.
Но вопрос, можно ли как-то сделать что бы всегда текст был utf8, без доп. команд?

Сейчас таблица выглядит так:
http://i47.fastpic.ru/big/2013/0605/85/4265ebbb7226cfcc3d65e1fa46f7c985.png
и так
http://i47.fastpic.ru/big/2013/0605/be/567538d2ff9317515750989e219c63be.png
И почему внизу написано swedish?

23

Re: Опять русские буквы.

uniken1 сказал:

Но вопрос, можно ли как-то сделать что бы всегда текст был utf8, без доп. команд?

Для этого надо настроить сервер MySQL добавив в конфигурационный файл my.ini/my.conf строку:

init-connect="SET NAMES utf8"
uniken1 сказал:

И почему внизу написано swedish?

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