彻底解决Oracle中文乱码

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 彻底解决Oracle中文乱码

影响Oracle编码的配置有3处:

服务端字符集 操作系统字符集 NLS_LANG字符集
SELECT * FROM NLS_DATABASE_PARAMETERS locale export
american_america.AL32UTF8 en_US.UTF-8 AMERICAN_AMERICA.ZHS16GBK

问题复现:

1. 创建表

CREATE TABLE "CY_BIF_DEV"."MYSQL_TEST_10" 
    (    "ID" NUMBER(7,0) NOT NULL ENABLE, 
    "STRING_VALUE_NOT_NULL" VARCHAR2(100) NOT NULL ENABLE
   );
  
select * from mysql_test_10;
delete from mysql_test_10;
select dump(STRING_VALUE_NOT_NULL, 1016) from mysql_test_10;

2. 检查编码配置

服务端字符集,NLS_CHARACTERSET: ZHS16GBK。
客户端os locale:LANG="en_US.UTF-8”。
环境变量NLS_LANG 没有配置。

3. 写入中文

  1. 插件中文INSERT INTO mysql_test_10 VALUES (2, '中国');中文是UTF-8编码。
  2. 读取中文select * from mysql_test_10,发现显示乱码。
  3. 检查oracle存储的编码,发现存储编码错误。
select dump(STRING_VALUE_NOT_NULL, 1016) from mysql_test_10。
Typ=1 Len=6 CharacterSet=ZHS16GBK: 3f,3f,3f,3f,3f,3f 

正确的UTF编码(中国e4,b8,ad,e5,9b,bd)GBK编码(d6,d0,b9,fa)

问题修正

  • 设置NLS_LANG与客户端os字符集相同。
  • NLS_LANG=american_america.AL32UTF8;

问题分析

  • client端使用UTF8编码,发送到Oracle server端后,server端读取NLS_LANG是空后,直接用GBK编码了数据,于是存储时,字符就错乱了,大小6字节。
  • 设置NLS_LANG=american_america.AL32UTF8后,server端会先到UTF8编码表中查询,翻译后以GBK编码存储,大小4字节。

问题总结

  • NLS_LANG 与客户端os字符集要保持一致。
  • 为了减少翻译开销,最好“服务端字符集”,“客户端os字符集”和NLS_LANG,3者保持一致。

欢迎加入橙鹰数据, 575834439@qq.com

https://www.cnblogs.com/xdouby/p/5666624.html
https://www.cnblogs.com/bingo1717/p/7803359.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
Oracle 关系型数据库 Linux
oracle中文乱码问题
oracle中文乱码问题
29 0
|
SQL Oracle 关系型数据库
PLSQL查询Oracle表中文乱码解决
PLSQL查询Oracle表中文乱码解决
221 0
PLSQL查询Oracle表中文乱码解决
|
SQL Oracle 关系型数据库
|
SQL Oracle 关系型数据库
|
SQL Oracle 关系型数据库
oracle 中文乱码解决办法
---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多。ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多年从事ORACLE数据库管理,经常收 到周围用户和外地用户反映有关ORACLE数据库汉字显示问题的求援信,主要现象是把汉字显示为不可识别的乱码,造成原来大量信息无法使用。本文
1935 0
|
SQL 存储 Oracle
Oracle字符集的简单图解,中文乱码解决
Oracle字符集的简单图解,中文乱码解决 经常碰到SQLPLUS展现乱码的问题,字符集和相关的定义都有说明但是很少有能把这些关系说的很简单易懂的。
2242 0
|
Oracle 关系型数据库 Linux
oracle显示中文乱码
oracle显示中文乱码 问题描述: windows下安装oralce客户端,编码为 SIMPLIFIED CHINESE_CHINA.AL32UTF8 redhat6下安装oracle 11g rac服务端,编码为 AMERICAN_AMERICA.AL32UTF8 客户端插入中文数据,服务端显示乱码,客户端显示正常 服务端插入中文数据,服务端显示乱码,客户端显示乱码 分析: 导致中文乱码的产生的原因是客户端和服务端的编码字符集不统一。
1393 0