mysqldump под windows 7 powershell преобразовал всю мою строку utf-8 в latin1 или что-то подобное - PullRequest
1 голос
/ 27 мая 2011

Я только что сделал простой старый дамп MySQL с чем-то вроде этого

mysqldump -h "192.168.0.6" -uroot -p db_name > my_sexy_dump_file.sql. 

Произошло то, что при дампе базы данных был создан файл, в котором все мои строки utf-8 были преобразованы в latin1. по крайней мере, мне кажется, что это было сделано, потому что теперь у меня есть 2 буквы для каждого, который я имел ранее. результат выглядит так:

╒Ñ╒╢╒┐╓Ç╒╕╒╢╒í╒ »╒í╒╢ ╒ú╓Ç╒í╒╜╒Ñ╒╢╒╡╒í╒»

╘╗╒╢╒Ñ╒ »╒╕╒ó╒í╒╢╒» ╒╕╓é╒┤

Оригинальный текст был на армянском.

как я могу это исправить? выполнение файла дампа выдает ошибку. скопируйте и вставьте запросы вставки в клиентское приложение mysql, например, sqlyog просто записывает поврежденную строку в таблицу.

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Вот как я делаю это, чтобы не потерять информацию о кодировке:

  1. Подумайте об использовании флага -r для mysqldump, чтобы вам не приходилось передавать вывод через stdout-> stdin
  2. Убедитесь, что вы используете флаг --set-charset (или --opt), чтобы файл дампа содержал команду SET NAMES.
  3. Импорт с использованием команды SOURCE filename.

Вот мой полный скрипт дампа (для Bash, поскольку я не запускаю Windows, но вы, вероятно, сможете извлечь из них кое-что хорошее):

#!/bin/bash                                                                             
# Version 2.6                                                                           
# Dump a database to file, to be used in migration or as a backup                       
# Emil Vikstrom 2009-2010                                                    

DB="$1";
FILENAME="$DB.$(date -I)"
TMP="$FILENAME.sql"
I=1
while [ -e "$TMP" ] || [ -e "$TMP.gz" ]; do
        let I=$I+1
        TMP="$FILENAME.$I.sql"
done
FILENAME="$TMP"

echo "[$(date +%R)] Dumping..."
mysqldump --single-transaction --hex-blob --add-drop-table --opt -e --quick --quote-names -r "$FILENAME" "$DB"
echo "[$(date +%R)] Compressing..."
gzip "$FILENAME"
echo "[$(date +%R)] Done: $FILENAME.gz"

А вот соответствующий скрипт импорта:

#!/bin/bash                                                                             
# Import a database SQL file                                                            
# Emil Vikstrom 2008                                                         
# Version 2.1                                                                           

DUMPFILE="$1"
DATABASE="$2"

if [[ $DUMPFILE =~ "(.*)\.gz"  ]]; then
        if [ -e $DUMPFILE ]; then
                echo "[$(date +%R)] Unzipping..."
                gunzip "$DUMPFILE"
        fi
        DUMPFILE="${BASH_REMATCH[1]}"
fi

echo "[$(date +%R)] Importing $DUMPFILE..."
echo "SOURCE $DUMPFILE;" | mysql "$DATABASE"
echo "[$(date +%R)] Done"
0 голосов
/ 01 ноября 2017

Проблема немного сложнее при работе с дампами через powershell. Если у вас есть iconv, вы можете попробовать исправить кодировку примерно так:

"C:\Program Files (x86)\GnuWin32\bin\iconv.exe" -f ISO-10646-UCS-2 -t 437//TRANSLIT "D:\all-db-dump.sql" > "D:\out.sql"

Как указано здесь: http://devmd.com/r/fixing-corrupt-mysql-dumps-windows-10-power-shell

0 голосов
/ 02 июня 2011

Я исправил это, создав карту всего алфавита и заменив все поврежденные символы по одному.подробнее о том, что я сделал здесь: http://fictionalrealm.com/coding/2011/05/29/mysqldump-corrupted-utf8-data-when-dumping-on-windows-machine/

...