oracle 数据库插入中文乱码

一.

查询数据库编码

select userenv('language') from dual;

查询服务器编码

select * from v$nls_parameters;

推出sql查询系统编码

root@f096e625bcd3:/# 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=

可以看到当前编码格式为POSIX,而这种编码格式不支持中文

  解决办法:locale -a查看容器所有语言环境

  

使用locale -a 查看当前可用的字符集,这里我们看到有C.UTF-8和zn_CN.UTF-8,这两种字符集都支持中文。如果当前不存在zn_CN.UTF-8,可以使用sudo apt-get -y install language-pack-zh-hans进行安装。

sudo apt-get -y install language-pack-zh-hans

 

 C.UTF-8可以支持中文,只需要把容器编码设置为C.UTF-8即可

    1.临时修改:

     export LANG=zh_CN.UTF-8

root@f096e625bcd3:/#  export LANG=zh_CN.UTF-8
root@f096e625bcd3:/# locale
LANG=zh_CN.UTF-8
LANGUAGE=
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

    2.永久修改:修改Dockerfile

      在Dockerfile中添加一行

      ENV LANG C.UTF-8

      重新制作docker镜像,docker run -ti [镜像] 进入容器后执行locale发现编码格式已经被修改为C.UTF-8,之前出现的中文文件名乱码问题也没有了。

  三. 修改oracle 编码

1.查看当前数据库编码

select userenv('language') from dual;
SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

2.查看系统 NLS_LANG

echo $NLS_LANG

设置NLS_LANG

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

成功

posted @ 2019-05-26 17:00  江期玉  阅读(6152)  评论(0编辑  收藏  举报