URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 82244
[ Назад ]

Исходное сообщение
"перенос базы mysql, сбилась кодировка"

Отправлено daevy , 03-Окт-08 11:44 
Всем доброго веремени суток, случилась такая проблема
есть машина linux, с локалью UTF-8 на ней крутится MySQL для программы SAMS, так вот я сделал бэкап базы средствами mysqldump затем скопироавл на другую машину (с UTF-8) и залил ее в новый mysql следующим образом: mysql -u root -p < mysqlbase
все было хорошо до тех пор пока я не залез в админку SAMS'а все что было на русском языке, стало каракулями. Так вот куда копать?

Содержание

Сообщения в этом обсуждении
"перенос базы mysql, сбилась кодировка"
Отправлено sergey.shkolin , 03-Окт-08 12:27 
>Всем доброго веремени суток, случилась такая проблема
>есть машина linux, с локалью UTF-8 на ней крутится MySQL для программы
>SAMS, так вот я сделал бэкап базы средствами mysqldump затем скопироавл
>на другую машину (с UTF-8) и залил ее в новый mysql
>следующим образом: mysql -u root -p < mysqlbase
>все было хорошо до тех пор пока я не залез в админку
>SAMS'а все что было на русском языке, стало каракулями. Так вот
>куда копать?

ну а сама база то в какой кодировке?


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 03-Окт-08 13:05 
>ну а сама база то в какой кодировке?

с mysql туго, если подскажите как узнать то напишу.
в my.cnf ничего по кодировкам не написано.
mysql -V выдает - mysql  Ver 14.7 Distrib 4.1.20


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 03-Окт-08 14:41 

>ну а сама база то в какой кодировке?

на исходной машине я посмотрел через show variables; думаю что вы спрашивали об этом
| character_set_client           | latin1 |
| character_set_connection       | latin1
| character_set_database         | latin1                                                
| character_set_results          | latin1                                                
| character_set_server           | latin1                                                |
| character_set_system           | utf8

на целевой та же команда показывает вот что
| 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, сбилась кодировка"
Отправлено daevy , 03-Окт-08 15:12 
делаю запрос к базе в полях где должны быть русскоязычные строки, просто серый фон, в одной ветке форума написано что база импортировалась не правильно, как можно ее экспортировать с определенной кодировкой?

"перенос базы mysql, сбилась кодировка"
Отправлено sergey.shkolin , 03-Окт-08 17:44 
>делаю запрос к базе в полях где должны быть русскоязычные строки, просто
>серый фон, в одной ветке форума написано что база импортировалась не
>правильно, как можно ее экспортировать с определенной кодировкой?

mysqldump db_NAME --default_character_set=utf8 >> /db_NAME.sql


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 06-Окт-08 05:55 

>mysqldump db_NAME --default_character_set=utf8 >> /db_NAME.sql

ок. сейчас попробую


"перенос базы mysql, сбилась кодировка"
Отправлено Pahanivo , 06-Окт-08 07:20 
>
>>mysqldump db_NAME --default_character_set=utf8 >> /db_NAME.sql
>
>ок. сейчас попробую

Пипл а какая связь ЛОКАЛИ с КОДИРОВКОЙ МУСКУЛА? )


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 06-Окт-08 07:30 
>>
>>>mysqldump db_NAME --default_character_set=utf8 >> /db_NAME.sql
>>
>>ок. сейчас попробую
>
>Пипл а какая связь ЛОКАЛИ с КОДИРОВКОЙ МУСКУЛА? )

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


"перенос базы mysql, сбилась кодировка"
Отправлено Pahanivo , 06-Окт-08 10:06 
Нет. Локаль это локаль.
А кодировка в базах мускула - это другое.
В мускуле до 4.0 включительно дефолтная кодировка задавалась при компиляции либо в конфиге. Как правило для веб нужд cp1251.
Начиная с версии 4.1 появилась возможность указывать свою кодировку для баз, таблиц, столбцов. Также появились колейшены (сравнения), которые определяют как будут выполнятся операции сравнения над текстовыми данными.
Также надо принимать во внимание тот факт что при коннекте между клиентом и сервером может использоваться треть кодировка.
Поэтому чтобы у тя гарантированно сраслось и не пришлось плясать с подбором чарсета выгружай и загрузай базы с консоли с указанием конкретной кодировки.

"перенос базы mysql, сбилась кодировка"
Отправлено zoonman , 06-Окт-08 11:08 
> Как правило для веб нужд cp1251.

Нужды бывают разные, у меня UTF8


"перенос базы mysql, сбилась кодировка"
Отправлено Pahanivo , 06-Окт-08 13:21 
>> Как правило для веб нужд cp1251.
>
>Нужды бывают разные, у меня UTF8

Под веб чаще 1251 - ключевая фраза "как правило" )


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 06-Окт-08 13:47 
>[оверквотинг удален]
>В мускуле до 4.0 включительно дефолтная кодировка задавалась при компиляции либо в
>конфиге. Как правило для веб нужд cp1251.
>Начиная с версии 4.1 появилась возможность указывать свою кодировку для баз, таблиц,
>столбцов. Также появились колейшены (сравнения), которые определяют как будут выполнятся операции
>сравнения над текстовыми данными.
>Также надо принимать во внимание тот факт что при коннекте между клиентом
>и сервером может использоваться треть кодировка.
>Поэтому чтобы у тя гарантированно сраслось и не пришлось плясать с подбором
>чарсета выгружай и загрузай базы с консоли с указанием конкретной кодировки.
>

спасибо, за разъяснение.
на исходной машине я сейчас сделал так
mysqldump -u root -p --all --add-drop-table --all-databases --force --default_character_set=utf8  > mysqlbackup
на целевой запустил так
mysql -u root -p < mysqlbackup
все получится как надо или нет?:-)

при импорте также можно указать параметр --default_character_set=utf8 ?


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 07-Окт-08 06:54 
люди не получается. все равно при select * from table; вижу каракули. что я не сделал?


"перенос базы mysql, сбилась кодировка"
Отправлено Pahanivo , 07-Окт-08 08:07 
>люди не получается. все равно при select * from table; вижу каракули.
>что я не сделал?

Версии покажи, покажи настройки (кодировки).
Кодировку баз покажи.


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 07-Окт-08 09:03 
>Версии покажи, покажи настройки (кодировки).
>Кодировку баз покажи.

исходный сервер:
mysql  Ver 14.7 Distrib 4.1.20, for redhat-linux-gnu (i386) using readline 4.3
в my.cnf настройки кодировок не описаны

это кодировки баз?
character_set_client            | latin1                                                 |
| character_set_connection        | latin1                                                 |
| character_set_database          | latin1                                                 |
| 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              | latin1_swedish_ci                                      |
| collation_server                | latin1_swedish_ci

целевой сервер:
mysql  Ver 14.12 Distrib 5.0.60, for pc-linux-gnu (i486) using readline 5.2
в my.cnf
[mysql]
character-sets-dir=/usr/share/mysql/charsets
default-character-set=utf8

[mysqladmin]
character-sets-dir=/usr/share/mysql/charsets
default-character-set=utf8

[mysqlcheck]
character-sets-dir=/usr/share/mysql/charsets
default-character-set=utf8

[mysqldump]
character-sets-dir=/usr/share/mysql/charsets
default-character-set=utf8

[mysqlimport]
character-sets-dir=/usr/share/mysql/charsets
default-character-set=utf8

[mysqlshow]
character-sets-dir=/usr/share/mysql/charsets
default-character-set=utf8

[myisamchk]
character-sets-dir=/usr/share/mysql/charsets

[myisampack]
character-sets-dir=/usr/share/mysql/charsets

[mysqld]
character-set-server            = utf8
default-character-set           = utf8

в mysql консоли show variables показывает следующуе

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                                                                |
| character_sets_dir              | /usr/share/mysql/charsets/                                          |
| collation_connection            | utf8_general_ci                                                     |
| collation_database              | utf8_general_ci                                                     |
| collation_server                | utf8_general_ci


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 07-Окт-08 09:05 
выяснилось что в импортированную базу, на целевом сервере, невозможно внести строки с кириллицей.


"перенос базы mysql, сбилась кодировка"
Отправлено Pahanivo , 07-Окт-08 09:42 
Попробуй это
http://server-tuning.info/mysql/latin1-utf8.html

У тебя исходно latin1 а ты его в utf-8 импортируешь.
Если че мона попробовать на целевом серваке выставить latin1.


"перенос базы mysql, сбилась кодировка"
Отправлено daevy , 07-Окт-08 10:07 
>Попробуй это
>http://server-tuning.info/mysql/latin1-utf8.html
>
>У тебя исходно latin1 а ты его в utf-8 импортируешь.
>Если че мона попробовать на целевом серваке выставить latin1.

вобщем по статье все проделал, залил базу рускоязычные строки вобще исчезли, пустое место вместо них.
как можно выставить latin1 ?


"перенос базы mysql, сбилась кодировка"
Отправлено Pahanivo , 07-Окт-08 10:39 
>>Попробуй это
>>http://server-tuning.info/mysql/latin1-utf8.html
>>
>>У тебя исходно latin1 а ты его в utf-8 импортируешь.
>>Если че мона попробовать на целевом серваке выставить latin1.
>
>вобщем по статье все проделал, залил базу рускоязычные строки вобще исчезли, пустое
>место вместо них.
>как можно выставить latin1 ?

при создании баз укажи
юзай phpmyadmin там все удобно и понятно


"перенос базы mysql, сбилась кодировка"
Отправлено Yaroslav , 12-Дек-08 19:07 
>Попробуй это
>http://server-tuning.info/mysql/latin1-utf8.html
>
>У тебя исходно latin1 а ты его в utf-8 импортируешь.
>Если че мона попробовать на целевом серваке выставить latin1.

У меня отлично сработало. Переносил из cp1251 в latin1.
Спасибо.


"перенос базы mysql, сбилась кодировка"
Отправлено angra , 10-Окт-08 09:07 
>Так вот куда копать?

Как обычно, в сторону документации, благо для мускула она очень подробная и написана читаемым языком. Не вижу смысла цитировать в этом топике куски из доки. Основное на что стоит обратить внимание:
1. Текущая локаль никак не связана с кодировкой базы
2. Кодировка соединения(то что вы наблюдаете в клиенте mysql или пых скриптах) почти не связана с кодировкой базы.
3. Нужно учитывать все уровни кодировки: база->таблица->поле
4. Есть разница между кодировкой базы и кодировкой данных. Вам ничто не помешает пихать данные в cp1251 в поля с кодировкой latin1, вот только при попытке их извлечь получите невменяемый дамп. Все возможности мускула по прозрачной перекодировке работают только если данные в базе соответствуют указанной кодировке. То есть например, если указана для поля(таблицы, базы) кодировка cp1251 и данные туда пихались в cp1251, то независимо от кодировки(например utf8 или koi8r) клиента(а mysql и mysqldump это тоже клиенты) вы увидите данные в нормальном виде(кроме неконвертируемых символов, например в koi8r нет некоторых кавычек).