系统更新后mysql用不了中文,Docker下不支持中文解决办法-已验证有效

一、起因和验证

由于在项目中使用了Docker的mysql容器,需要到docker里面去做增量的sql更新。结果发现更新后的中文都丢失了。怀疑是docker容器内承载的系统不支持中文.

所以,通过宿主机进入docker的bash环境后,连接mysql,执行sql语句。再次验证;

现象如图所示:

+-----+-----------+----------+--------+------------+

| id | name | value | dic_id | is_default |

+-----+-----------+----------+--------+------------+

| 1 | ??? | 1 | 1 | 1 |

| 2 | ??? | 2 | 1 | 1 |

| 3 | ??? | 3 | 1 | 1 |

| 4 | ?? | 1 | 2 | 1 |

进入Docker内部,执行sql语句现象:

[root@vm172-31-32-3 ~]# docker exec -it mysql2 bash

root@9929c772da63:/# mysql -u root -p

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;

Database changed

##下一行是原文:

mysql> insert into user(id,username) values('1','张三');

##变成了:

mysql> insert into user(id,username) values('1','');

二、查找原因

2.1 查看系统及系统所支持字符集

A、使用 cat /etc/issue 命令查看承载系统

root@9929c772da63:/# cat /etc/issue

Debian GNU/Linux 9 \n \l

B、使用locale查看linux正在使用的编码方式

root@9929c772da63:/# locale

LANG=

LANGUAGE=

LC_CTYPE="POSIX"

LC_NUMERIC="POSIX"

LC_TIME="POSIX"

LC_COLLATE="POSIX"

LC_MONETARY="POSIX"

LC_MESSAGES="POSIX"

LC_PAPER="POSIX"

LC_NAME="POSIX"

LC_ADDRESS="POSIX"

LC_TELEPHONE="POSIX"

LC_MEASUREMENT="POSIX"

LC_IDENTIFICATION="POSIX"

LC_ALL=

C、查看Linux支持的编码方式

root@9929c772da63:/# locale -a

C

C.UTF-8

POSIX

root@9929c772da63:/#

三、原因及解决方案

3.1 原因及无法生效的解决方案

首先,目前网上搜了下,出现这个问题的以Debian系统居多,网上有的方法是直接在命令行下输入命令,然后重新加载系统变量,不过笔者发现并未改变系统编码;

##注:此方案笔者测试未生效

root@9929c772da63:/# LANG=C.UTF-8 (有的是zh_CN.UTF-8,不过我在本地没发现这种编码)

root@9929c772da63:/# source /etc/profile

3.2 解决方案一

此方案参考了peakhell的文章 《解决docker中的容器无法使用中文的问题》

https://www.jianshu.com/p/6fe582ba6d3d

使用vim编辑 /etc/profile 将“export LANG="C.UTF-8”命令添加在profile最后

但是Debian内没有vim以及vi工具可以有2种方法

注意:这2方法都是临时改变编码,一旦从容器中退出,然后再进去,编码集还原,需要再次使用 source /etc/profile再次刷新才可

3.2.1将文件从docker容器内拷贝出,然后再宿主机上修正后,再拷贝回去

#将容器内/etc/profile文件拷贝到宿主机/app/backup目录下

[root@vm8-80-8-8 sql]# docker cp mysql2:/etc/profile /app/backup

[root@vm8-80-8-8 sql]# vim /app/backup/profile

#追加命令-在最后一行,然后保存

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))

# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

....忽略N行

if [ -d /etc/profile.d ]; then

for i in /etc/profile.d/*.sh; do

if [ -r $i ]; then

. $i

fi

done

unset i

fi

export LANG="C.UTF-8"

最后将文件拷贝回容器内,刷新系统变量

[root@vm8-80-8-8 sql]# docker cp /app/backup/profile mysql2:/etc/profile

[root@vm8-80-8-8 sql]# docker exec -it mysql2 bash

root@9929c772da63:/# source /etc/profile

检查结果

root@9929c772da63:/# locale

LANG=C.UTF-8

LANGUAGE=

LC_CTYPE="C.UTF-8"

LC_NUMERIC="C.UTF-8"

LC_TIME="C.UTF-8"

LC_COLLATE="C.UTF-8"

LC_MONETARY="C.UTF-8"

LC_MESSAGES="C.UTF-8"

LC_PAPER="C.UTF-8"

LC_NAME="C.UTF-8"

LC_ADDRESS="C.UTF-8"

LC_TELEPHONE="C.UTF-8"

LC_MEASUREMENT="C.UTF-8"

LC_IDENTIFICATION="C.UTF-8"

LC_ALL=

3.2.2直接在容器内安装vim工具,直接编辑

首先,更换apt-get源,然后再docker容器内安装vim

mv /etc/apt/sources.list /etc/apt/sources.list.bak

echo "deb http://mirrors.163.com/debian/ jessie main non-frcontrib" >/etc/apt/sources.list

echo "deb http://mirrors.163.com/debian/ jessie-proposed-updatmain non-free contrib" >>/etc/apt/sources.list

echo "deb-src http://mirrors.163.com/debian/ jessie main non-frcontrib" >>/etc/apt/sources.list

echo "deb-src http://mirrors.163.com/debiajessie-proposed-updates main non-free contri>>/etc/apt/sources.list

#更新安装源

apt-get update

apt-get install -y vim

后续操作,如3.1.1所示,不在赘述;

3.2 直接在Docker建立是指定字符集(暂时未验证)

参考:

在纯docker环境中

docker run -it mysql env LANG=C.UTF-8 /bin/bash

在K8S环境中

//启动

kubectl run -it –rm –image=mysql mysql-client – env LANG=C.UTF-8 /bin/bash

//进入pod

kubectl exec -ti mysql-client – env LANG=C.UTF-8 /bin/bash

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值