Отправляет email-рассылки с помощью сервиса Sendsay

[TC] Изменение кодировки пустой бд mysql

Доброго времени суток всем!

Ставлю cms, которая в бд пишет данные в cp-1251, но бд по умолчанию
создаётся в utf-8. Задача: сменить кодировку сначала всех таблиц, а
потом всей бд средствами sql-запросов, т.к. в PhpMyAdmin у хостеран е
нашёл задание дефолтной кодировки.

Решение 1: запросы sql:

ALTER TABLE table1 CONVERT TO CHARACTER SET cp1251_general_ci
ALTER TABLE table1 DEFAULT CHARACTER SET cp1251_general_ci
ALTER DATABASE database1 DEFAULT CHARACTER SET cp1251_general_ci

Ругается на несовместимые данные, подозреваю, что на двубайтовые
символы юникода.

Решение 2. Тупо очищаю всю бд и выполняю запрос:

ALTER DATABASE database1 DEFAULT CHARACTER SET cp1251_general_ci

Никаких изменений.

Вопрос: Что я делаю неправильно и как всё-таки сменить кодировку?

Ответить   yuniks Wed, 1 Feb 2012 15:39:36 +0400 (#2356396)

 

Ответы:

Здравствуйте, yuniks.

Вы писали 1 февраля 2012 г., 17:39:36:

COLLATION жестко привязан к CHARACTER SET-у и может быть задан только из поддерживаемых
кодировкой. Проще говоря, начало названия COLLATION должно совпадать
с CHARACTER SET. К примеру, для кодировки utf8 можно задать правила сравнения
utf8_bin, но нельзя cp1251_bin. Если для поля не указан COLLATION, то он
берется по умолчанию. К примеру, для utf8 - utf8_general_ci. В большинстве случаев
COLLATION по умолчанию устраивает пользователя, а это значит, что его
задавать не нужно. То есть, достаточно указать только кодировку.
Кодировка может быть задана для поля, таблицы, database. ЛИИбо криво настроена
кодировка таблиц.

Ответить   Thu, 2 Feb 2012 01:04:15 +0600 (#2356931)

 

Приветствую всех.

Это не должно вызывать проблем, если mysql получает от cms корректную информацию
о кодировке запросов.
А если не получает, то изменение кодировки хранения вам ничего не даст (можно,
конечно, полагаться на случайное совпадение, но это не наш метод).
Использование utf-8 в качестве кодировки хранения -- это рекомендуемый вариант,
т.к. исключает потери для любых символьных наборов.
Значения действующих кодовых таблиц можно посмотреть при помощи SHOW VARIABLES.
Кроме всего прочего, там будет что-нибудь типа:
...
| character_set_client | ...|
| character_set_connection |... |
и так далее
Переменные можно менять при помощи sql-команды SET.
Попробуйте, например, в cms разместить сразу после соединения с mysql и выбора
базы:
SET NAMES cp1251
По идее, это должно позволить вам указать mysql, что запросы и результаты должны
быть в кодировке cp1251, независимо от используемой кодировке хранения. Преобразование
кодировок mysql выполнит самостоятельно.
Разумеется, это будет справедливо только для данных, отправленных в mysql после
указанной команды. Старые данные, скорее всего, придется удалить.

Успехов. Анатолий.

Ответить   "i_chay" Thu, 2 Feb 2012 09:08:00 +0400 (#2357280)