Назад | Перейти на главную страницу

MySQL dump-restore заменяет символы на 3Fh

Сервер FreeBSD с Mysql и подобным make.conf

.if ${.CURDIR} == ${PORTSDIR}/databases/mysql50-server
WITH_CHARSET=cp1251
WITH_COLLATION=cp1251_bin
BUILD_OPTIMIZED=yes
BUILD_STATIC=yes
.endif
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql50-client
WITH_CHARSET=cp1251
WITH_COLLATION=cp1251_bin
BUILD_OPTIMIZED=yes
.endif

У меня есть таблица mysql с такой структурой

mysql> show create table phpbb_bt_torrents\G
*************************** 1. row ***************************
       Table: phpbb_bt_torrents
Create Table: CREATE TABLE `phpbb_bt_torrents` (
`info_hash` char(20) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL DEFAULT '',
) ENGINE=InnoDB AUTO_INCREMENT=128511 DEFAULT CHARSET=cp1251

Я поддерживаю это ночью с mysqldump --quote-names --add-drop-table db>db.sql

Если я восстановлю резервную копию с помощью mysql < db.sql на том же сервере то получаю не совсем те же данные, например:

SELECT hex(info_hash) FROM phpbb_bt_torrents

8CB0701A0C8B7D97653888E8B959A6420AEC7679 становится 8CB0701A0C8B7D9765383FE8B959A6420AEC7679 после восстановления

A9986D2E961E1F407E74E9D18D811DDB702924F5 становится A93F6D2E961E1F407E74E9D18D811DDB702924F5 после восстановления

и так далее ... я заметил, что искажаются только символы 88h и 98h, но их может быть больше.

Есть ли способ сделать резервную копию данных без повреждений?

Я открыл билет на Bugs.MySQL.com

Обходной путь оттуда:

укажите параметр --default-character-set = cp1251. Но этот обходной путь не будет работать с тестовым примером со смешанными наборами символов.

Можете ли вы попробовать сделать дамп с помощью mysqldump --opt ..., а затем восстановить его?

На одном и том же сервере это не должно иметь значения, просто чтобы убедиться, что это не какая-то пользовательская конфигурация.