SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.01.2010 06:31:44

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Нарушилась кодировка

есть БД:
запрос show variable; показывает:

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
collation_connection = utf8_general_ci
collation_database = utf8_general_ci
collation_server = utf8_general_ci

делал в putty (SSH)...
*************************************
ПЕРВЫЙ ВАРИАНТ:
когда выполняю запрос в php (сам php файл в UTF-8):

mysql_query("INSERT INTO `database`.`table` (`text`) VALUES ('Привет');");

в БД записывается это: привет < смотрю через phpMyAdmin.
на странице (сам файл страницы в UTF-8 так же установлен content="text/html; charset=utf-8") вывожу это, вижу нормальный русский текст, тобишь "Привет".


ВТОРОЙ ВАРИАНТ:
делаю "насильно" после соединения с БД:
mysql_query("SET names 'utf8' COLLATE 'utf8_general_ci'");
и выполняю тот же выше приведенный запрос:
mysql_query("INSERT INTO `database`.`table` (`text`) VALUES ('Привет');");

в БД записывается слово "Привет" < смотрю через phpMyAdmin. вывожу это на страницу, вижу нормальный русский текст... в то время как то что я записывал ранее выводится уже как привет

*************************************
объясните мне пожалуйста почему так происходит при ПЕРВОМ ВАРИАНТЕ?
как перекодировать БД если туда всё записано по ПЕРВОМУ ВАРИАНТУ - вернее, объясните сам алгоритм, что на что кодировать?
есть альтернатива перекодированию?

PS. модуль php:
iconv - есть;
php-mbstring - нету, возможности установить - нету;

- для чего это? ответ: по первому варианту в БД с установленной utf8_general_ci поиск русских символов регистроЗАВИСИМ, когда по ВТОРОМУ ВАРИАНТУ поиск регистроНЕзависим.

огромное спасибо за ранее!!!

Отредактированно DRUG_ADDICT (10.01.2010 06:33:33)

Неактивен

 

#2 10.01.2010 06:32:45

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

вот есть идея:
рас браузер по ПЕРВОМУ ВАРИАНТУ всё отображается нормально, то наверно есть и способ всё оттуда вытащить в таком виде который мы наблюдаем на странице (ПЕРВЫЙ ВАРИАНТ), а затем уже нормально перелапатить БД в UTF-8 - т.к. русские символы UTF-8 в среде cp1251 будут отображаться как символы + русские буквы, сейчас же мы видим символы + латинские буквы - это на лицо неверная кодировка, как вот её вернуть в нормальное состояние не понятно.

понятно что точно не так:
*символы + латинские буквы (utf8) > конвертирование > символы + русские буквы (utf8)*

тут наверно скорее как я писал вышет так будет:
*символы + латинские буквы (utf8) > конвертирование > cp1251*
-- но вот КАК?! sad

Неактивен

 

#3 10.01.2010 09:14:14

kiligin
Завсегдатай
Зарегистрирован: 28.11.2009
Сообщений: 48

Re: Нарушилась кодировка

не смог прочитать весь пост, но может set charchter_set = cp1251 тебе поможет! посмотри точный синтаксис, а то я че-т подзабыл...

Неактивен

 

#4 10.01.2010 20:41:06

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

kiligin написал:

не смог прочитать весь пост,

смешно стало? big_smile мне тоже смешно sad

kiligin написал:

но может set charchter_set = cp1251 тебе поможет! посмотри точный синтаксис, а то я че-т подзабыл...

установили переменные:

set character_set_client = cp1251;
set character_set_connection =  cp1251;
set character_set_database = cp1251;
set character_set_results = cp1251;
set character_set_server = cp1251;
set collation_connection = cp1251_general_ci;
set collation_database = cp1251_general_ci;
set collation_server = cp1251_general_ci;

всё тоже самое, нет русского текста.

Неактивен

 

#5 11.01.2010 00:25:54

kiligin
Завсегдатай
Зарегистрирован: 28.11.2009
Сообщений: 48

Re: Нарушилась кодировка

не смог, потому что не спал сутки... писал записку к диплому.

по крайней мере в моем приложении с использованием ado+odbc при добавлении в бд русских сиволов, в самой бд хранится чёрти-что. а вот при выводе из бд в приложение все ожидаемо. odbc и mysql настроены на испоьзование cp1251.
Раннее в бд вводились русские символы в формате latin1. Сейчас они отображаются также ожидаемо.

Следовательно:
- попробуй саму бд настроить на нужный шрифт  (create database namedb ... default caheacter_set = cp1251 [или это к таблицам применяется, точно не помню]);
- попробуй настроить коннектор к бд на использование той же кодировки.

у меня пока все мысли по этому поводу.

Неактивен

 

#6 11.01.2010 12:34:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нарушилась кодировка

Видимо, php у Вас при подключении ставит свою кодировку. SET NAMES делать
всегда правильно и всегда нужно. Просто потому что php верить нельзя smile

Неактивен

 

#7 11.01.2010 13:41:36

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

paulus написал:

Видимо, php у Вас при подключении ставит свою кодировку. SET NAMES делать
всегда правильно и всегда нужно. Просто потому что php верить нельзя smile

так... а как узнать какую? хммм... phpinfo(); ?

вот что есть:

Код:

Accept-Charset     windows-1251,utf-8;q=0.7,*;q=0.7
SQLite Encoding     UTF-8
_SERVER["HTTP_ACCEPT_CHARSET"]    windows-1251,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_CHARSET     windows-1251,utf-8;q=0.7,*;q=0.7

или не так? и почему то на двух разных машинах получается php "врет" одинаково, на одной фряха, на другой suse linux... всё по дефолту, вроде... на suse точно по дефолту...

а вот пример бд:

Код:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

CREATE TABLE IF NOT EXISTS `text` (
  `ID` int(11) NOT NULL auto_increment,
  `text` varchar(255) NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ;

INSERT INTO `text` (`ID`, `text`) VALUES
(1, 'ПÐ*Ивет'),
(2, 'привет'),
(3, 'Привет');

вот INSERT INTO по русски...
1 Привет
2 привет
3 ПРИвет
и вот такая бд получается когда просто без set names записываешь в бд:
mysql_query("INSERT INTO `database`.`table` (`text`) VALUES ('Привет');");
< при этом файл сам в utf8 (ещё рас пишу), вот ч за фигня sad

блин, перечитал уже весь Список доступных статей: Базы данных вот это особенно My SQL 4.1 и любые проблемы с русскими буквами
делал как написано:

Тестирование:
Попробуйте в phpMyAdmin-е выполнить запрос вида «SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица», где таблица и поле соответствующая таблица и поле с русским текстом, а кодировка — кодировка из проблемы №1.
Результат тестирования:
Если буквы (но необязательно слова) стали русскими, значит текст в базе лежал не в правильной кодировке и его нужно сконвертировать.
Если буквы стали русскими, а слова нет («бнопня»), значит неверно выбрана одна из русских кодировок – пробуйте другие, пока не получится русских слов.

были русские буквы + символы, но далее написано что нужно ПРАВИЛЬНО сконвертировать, но как sad( вот читал 9.1.12. Column Character Set Conversion не помогло! все команды перепробовал! sad

когда я записываю в файл эти данные (смотрим пример данных в бд INSERT INTO ...) в файл записывается нормальный русский текст, может какой то бекап скрипт написать уже чтоле пццц sad((

Неактивен

 

#8 11.01.2010 14:13:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нарушилась кодировка

А наши статьи читали? Или только сторонние? wink

1. Найдите нормальный клиент. Например, консоль. Убедитесь, что эта
консоль нормально настроена в кодировке, которую Вы знаете. Например,
можно явно проверить, что моя консоль настроена, показывает русские
буквы и работает в utf8:

Код:

aquatica:~$ LANG=ru_RU.UTF-8 date
Пнд Янв 11 14:20:40 MSK 2010

2. В этом клиенте подключитесь к серверу и выполните явно установку
клиентской кодировки: SET NAMES utf8.

3. После этого проверьте, в какой кодировке лежат данные. Если данные
написаны кракозяблами — их надо преобразовывать (см статью, например).

4. Если данные написаны по-русски, то ничего преобразовывать не надо,
надо менять существующие приложения так, чтобы они корректно работали
с текущими данными.

Неактивен

 

#9 11.01.2010 16:00:47

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

paulus написал:

А наши статьи читали? Или только сторонние? wink

sad ща буду сатреть, но в начале:

paulus написал:

1. Найдите нормальный клиент. Например, консоль. Убедитесь, что эта
консоль нормально настроена в кодировке, которую Вы знаете. Например,
можно явно проверить, что моя консоль настроена, показывает русские
буквы и работает в utf8:

есть, putty по SSH
выполняю:
ssh:~ # locale
LANG=POSIX
LC_CTYPE=ru_RU.UTF-8
...

ssh:~ # LANG=ru_RU.UTF-8 date
Пнд Янв 11 20:20:34 IRKT 2010
ssh:~ # mysql -u root -h localhost -p
Enter password: *********

paulus написал:

2. В этом клиенте подключитесь к серверу и выполните явно установку
клиентской кодировки: SET NAMES utf8.

есть сэр!

mysql> USE database;
Database changed
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM text;
+----+----------------------------+
| ID | text                       |
+----+----------------------------+
| 26 | ПРИвет  |
| 25 | привет |
| 24 | Привет |
+----+----------------------------+
3 rows in set (0.00 sec)


sad(( а вот когда делаю без SET names utf8;

mysql> USE database;
Database changed
mysql> SELECT * FROM text;
+----+--------------+
| ID | text         |
+----+--------------+
| 26 | ПРИвет |
| 25 | привет |
| 24 | Привет |
+----+--------------+
3 rows in set (0.00 sec)


во как получается! sad

paulus написал:

4. Если данные написаны по-русски, то ничего преобразовывать не надо,
надо менять существующие приложения так, чтобы они корректно работали
с текущими данными.

вот я и пишу, что ет то что у меня в бд не utf8 (+ см. рис.) - это не понятно что! но это "не понятно что" вылазит на страницу в браузере (и в SSH как видели) абсолютно адекватно, и нормально все отображаться... поиск естественно по такому регистроЗАВИСИМ sad и ещё есть много минусов sad и вообще так не надо... надо перекодировать, только вот снова вопрос: как это сделать и что на что кодировать... sad((

ну чтож... буду смотреть статьи, начну с той что Вы мне посоветовали http://sqlinfo.ru/articles/info/5.html sad


Прикрепленные файлы:
Attachment Icon 1453354345354354354345.jpg, Размер: 453,841 байт, Скачано: 432

Неактивен

 

#10 11.01.2010 16:04:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нарушилась кодировка

Ну вот если не делать SET NAMES, то там будет написана кодировка, в которой
реально лежат данные. Остается только перекодировать smile

Неактивен

 

#11 11.01.2010 16:31:01

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

paulus написал:

Ну вот если не делать SET NAMES, то там будет написана кодировка, в которой
реально лежат данные. Остается только перекодировать smile

вау smile))))))) АБАЛДЕТЬ!

сделал:
mysql> show variables;

Код:

 ...
| character_set_client            | latin1                                                    |
| character_set_connection        | latin1                                                    |
| character_set_database          | utf8                                                      |
| character_set_filesystem        | binary                                                    |
| character_set_results           | latin1                                                    |
| character_set_server            | latin1                                                    |
| character_set_system            | utf8                                                      |
| character_sets_dir              | /usr/share/mysql/charsets/                                |
| collation_connection            | latin1_swedish_ci                                         |
| collation_database              | utf8_general_ci                                           |
| collation_server                | latin1_swedish_ci  
 ...

блин... вот только слышал я что с кодировки latin1 русский текст не када не получится перекодировать... хотя ет наверно не так или... хм sad
буду пробовать!!!

ОГРОМНОЕ ВАМ СПАСИБО!!!

Неактивен

 

#12 11.01.2010 17:31:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нарушилась кодировка

Никогда — это неправда, в статье написано, как это сделать smile

Неактивен

 

#13 12.01.2010 16:23:12

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

вы конечно извиняйте меня, но не могу я понять как мне экспортировать бд... эххх... выяснили мы что там вся кириллица хранится у меня в latin1 (?при этом выводится корректно в консоли с кодировкой utf8?) на сколько мне известно в >mysqldamp нельзя указывать кодировку, ну вот я пишу:
ssh:~ #>mysqldump -u root -p -h localhost utf > /home/user/dump.sql
получаю файл с этими крокозябрами.

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

rssh:~ #>recode utf8..latin1 /home/user/dump.sql
и это не приносит результатов, вижу все те же каракули только чуть другого вида... тоже самое и с iconv
пробовал так же latin1..utf8

...

Неактивен

 

#14 12.01.2010 16:28:23

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

как в
mysql> копировать бд я без понятия, в инете не нашел такого, кажется нельзя вообще... а именно там latin1 по умолчанию стоит, может оттуда бы и экспортировал нормально бд, а с
ssh:~ #>mysqldump видать в utf8 всё записывает в файл dump.sql... и показывает так же как и в
mysql> после set names utf8

Код:

mysql> SET NAMES koi8r;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM text;
+----+--------------+
| ID | text         |
+----+--------------+
| 26 | ???▒???▒???? |
| 25 | ???????▒???? |
| 24 | ???????▒???? |
+----+--------------+
3 rows in set (0.00 sec)

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM text;
+----+----------------------------+
| ID | text                       |
+----+----------------------------+
| 26 | ПРИвет  |
| 25 | привет |
| 24 | Привет |
+----+----------------------------+
3 rows in set (0.00 sec)

mysql> SET NAMES cp1251;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM text;
+----+--------------+
| ID | text         |
+----+--------------+
| 26 | ???▒?????▒?▒ |
| 25 | ?????????▒?▒ |
| 24 | ?????????▒?▒ |
+----+--------------+
3 rows in set (0.00 sec)

mysql> SET NAMES latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM text;
+----+--------------+
| ID | text         |
+----+--------------+
| 26 | ПРИвет |
| 25 | привет |
| 24 | Привет |
+----+--------------+
3 rows in set (0.00 sec)

Отредактированно DRUG_ADDICT (12.01.2010 16:37:59)

Неактивен

 

#15 12.01.2010 17:49:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Нарушилась кодировка

Ненене; у Вас сами данные в utf8, а метаданные таблички говорят, что она в
latin1, и соединение в latin1.

mysqldump --default-character-set=latin1 -B dbname | sed 's/latin1/utf8/' >dump.sql

Получится дамп в utf8 (должен легко читаться в консоли utf8 по-русски), который
потом можно будет залить назад smile

Неактивен

 

#16 13.01.2010 00:32:00

DRUG_ADDICT
Участник
Зарегистрирован: 10.01.2010
Сообщений: 9

Re: Нарушилась кодировка

paulus написал:

Ненене; у Вас сами данные в utf8, а метаданные таблички говорят, что она в
latin1, и соединение в latin1.

mysqldump --default-character-set=latin1 -B dbname | sed 's/latin1/utf8/' >dump.sql

Получится дамп в utf8 (должен легко читаться в консоли utf8 по-русски), который
потом можно будет залить назад smile

получилось! ЕЩЁ РАС ВАМ СПАСИБО ОГРОМНОЕ!!!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson