windows 7 powershell下的mysqldump将我所有的utf-8字符串转换为latin1或类似的东西

时间:2011-05-27 09:58:36

标签: mysql utf-8 mysqldump

我刚刚用这样的东西做了一个简单的旧mysql转储

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

发生的事情是,转储数据库会生成一个文件,其中我的所有utf-8字符串都转换为latin1。至少在我看来,这已经完成,因为现在我有两个字母,我以前每一个。 结果如下:

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

Ինեկոբանկում

原文为亚美尼亚文。

我该如何解决这个问题?执行转储文件会产生错误。复制和粘贴插入查询到一个mysql客户端应用程序,如sqlyog只是将损坏的字符串写入表中。

3 个答案:

答案 0 :(得分:1)

我这样做是为了避免丢失字符集信息:

  1. 考虑对mysqldump使用-r标志,这样就不必通过stdout-> stdin
  2. 来管道输出
  3. 确保使用--set-charset标志(或--opt),以便转储文件包含SET NAMES命令。
  4. 使用SOURCE filename命令导入。

  5. 这是我的完整转储脚本(对于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