为什么在远程服务器上无法在mysql命令行中输入中文字符但本地可以正常

时间:2016-09-27 13:23:46

标签: mysql utf-8 character-encoding

在我的本地机器(Mac OS)iTerm2终端中,我可以登录远程mysql服务器并成功输入Chinese个字符

➜  ~ mysql -h remote_ip  -u username -p foo --safe-updates

mysql> select '你好';
+--------+
| 你好   |
+--------+
| 你好   |
+--------+
1 row in set (0.01 sec)

然后我通过ssh登录远程服务器

➜  ~ ssh root@remote_ip

并登录相同的mysql服务器

root@qa-web:~# mysql -h remote_ip  -u username -p foo --safe-updates

mysql> select '

但是这次我不能在命令行输入汉字,输入后它们会立即消失。

为什么会这样?

其他信息

以上第二种情况

mysql> status
...
Server characterset:    utf8mb4
Db     characterset:    utf8
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4

我的机器Mac OS

➜  ~ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

远程服务器

root@hg:~# locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

root@hg:~# locale -a
C
C.UTF-8
en_US.utf8
POSIX

将此sql(select 'hello','你好';)从Atom复制到Mysql命令行,效果为

mysql> select 'hello','';
+-------+--+
| hello |  |
+-------+--+
| hello |  |
+-------+--+
1 row in set (0.00 sec)

区域设置

➜  ~ 你好
zsh: command not found: 你好

远程

root@hg:~# 你好
-bash: $'\344\275\240\345\245\275': command not found

3 个答案:

答案 0 :(得分:1)

尝试使用mysql --default-character-set=utf8启动mysql 这会强制character_set_client,character_set_connection和character_set_results变量为UTF8。

来源:MySQL command line formatting with UTF8

当然,如果你使用的是中文特定的字符集,请从中开始。例如GB(gb18030)charsets。

答案 1 :(得分:0)

如果您使用的是cmd的Windows,那么......

命令“chcp”控制“代码页”。 chcp 65001提供了utf8,但它也需要安装一个特殊的字符集。 some code pages

在控制台窗口中设置字体:右键单击窗口标题→属性→字体→选择Lucida控制台

答案 2 :(得分:0)

在Unix系统上,您需要确保您的区域设置与终端仿真匹配。程序(如MySQL shell)使用语言环境值来确定要写入终端的编码。

在Mac上,默认语言环境通常是基于UTF-8的,它与默认的iTerm配置文件相匹配。

远程shell时,还需要确保远程语言环境与终端匹配。如果远程服务器是非mac,那么该区域设置更可能不是基于UTF8的。

远程shell时,获取播放中的语言环境

locale

要使用Mac默认值,需要*.utf-8。例如:

en_gb.utf-8

如果不是,那么你必须改变它,至少是暂时的。查看可用的语言环境:

locale -a

找到合适的语言环境,然后设置LANG环境变量:

export LANG=en_gb.utf-8

现在您可以运行mysql并获得正确的结果。