我刚刚用这样的东西做了一个简单的旧mysql转储
mysqldump -h "192.168.0.6" -uroot -p db_name > my_sexy_dump_file.sql.
发生的事情是,转储数据库会生成一个文件,其中我的所有utf-8字符串都转换为latin1。至少在我看来,这已经完成,因为现在我有两个字母,我以前每一个。 结果如下:
╘┐╒Ñ╒╢╒┐╓Ç╒╕╒╢╒í╒»╒í╒╢╒╢ú╓Ç╒í╒╜╒Ñ╒╢╒╡╒í╒»
Ինեկոբանկում
原文为亚美尼亚文。
我该如何解决这个问题?执行转储文件会产生错误。复制和粘贴插入查询到一个mysql客户端应用程序,如sqlyog只是将损坏的字符串写入表中。
答案 0 :(得分:1)
我这样做是为了避免丢失字符集信息:
-r
标志,这样就不必通过stdout-> stdin --set-charset
标志(或--opt
),以便转储文件包含SET NAMES
命令。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"
答案 1 :(得分:0)
我通过创建整个字母表的地图并逐个替换所有损坏的字符来解决这个问题。 关于我在这里做了什么的更多细节:http://fictionalrealm.com/coding/2011/05/29/mysqldump-corrupted-utf8-data-when-dumping-on-windows-machine/
答案 2 :(得分:0)
通过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