通过 ssh 复制带有重音符号的 sql 文件

通过 ssh 复制带有重音符号的 sql 文件

我正在尝试将一个数据库从服务器 A 迁移到服务器 B。

数据库是mysql。该数据库有一些带有 ç、ã é、... 等字符的记录

数据库编码为UTF8

很快服务器A我这样导出

mysqldump -u root -p sis > sis3.sql  

然后我打开文件(用vi),字符不正常。所以我尝试了

 mysqldump -u root -p sis --default-character-set=utf8 > sis3.sql 

还没好。然后

 mysqldump -u root -p sis --default-character-set=latin1 > sis3.sql 

现在的文件似乎好的。

副本

到服务器 B 的复制是从服务器 B 使用

scp -i p [email protected]:/home2/sis3.sql ~/

但是每当我将字符集复制到服务器 B 时,该文件就永远不会正常。 “特殊”字符总是错误的。

我尝试了三种方式导入(latin1、utf8、无默认),都出错了。

我这样导入:

mysql -u root -p"pwdpwdpwd" --default-character-set=utf8 sis < sis3.sql 

当然是更改默认字符集。

但是,正如我导入 mysql 之前一样,文件已经“损坏”,我认为这可能是通过 ssh 传输引起的。

有没有办法转移mysql数据库而不出现这个问题?

服务器信息

服务器A

Linux version 2.6.32-5-amd64 (Debian 2.6.32-48squeeze6) ([email protected]) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Tue May 13 16:34:35 UTC 2014
# locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=

服务器B

Linux version 4.4.0-0.bpo.1-amd64 ([email protected]) (gcc version 4.9.2 (Debian 4.9.2-10) ) #1 SMP Debian 4.4.6-1~bpo8+1 (2016-03-20)
# locale
LANG=pt_BR.UTF-8
LANGUAGE=
LC_CTYPE="pt_BR.UTF-8"
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="pt_BR.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="pt_BR.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=

答案1

我发现了一些对其他人有用的东西

http://alexking.org/blog/2008/03/06/mysql-latin1-utf8-conversion

问题是导出为 latin1 并将文件更改为“set NAMES utf8”,因为我的所有表都是 utf8。

工作了。

答案2

  1. 检查您的终端或终端模拟器正在使用UTF-8编码。

    locale转储 shell 的配置,而不是终端仿真器的配置。

    如果使用--default-character-set=utf8,输出将被utf8编码。因此,如果您的终端(在服务器 A 上)未正确显示,则说明您的终端配置已损坏。

    例如,在 gnome 终端菜单中,选择Terminal,Set Character Encoding

  2. 如果服务器 A 和 B 上文件的 md5sum 校验和相同,您可以“确定”文件已正确传输。

答案3

它与您的终端模拟器无关。

mysqldump -u root -p sis --default-character-set=latin1 > sis3.sql

mysql -u root -p"pwdpwdpwd" --default-character-set=utf8 sis < sis3.sql

使用导出文件时使用的相同字符集导入文件。

您在导出的文件中看到的内容取决于您用来查看该文件的工具的设置。不要混淆这个问题——看看 mysql 如何解释数据。如果您的备份很大,请使用较小的数据集进行一些实验。

大概这是openssh?只要您在中间没有使用其他软件,文件就不会在传输过程中被修改。您可以使用 md5sum 或类似的方法来验证这一点。

相关内容