oracle读写时相关字符集详解

服务器端操作系统(Oracle linux)字符集

服务器端数据库字符集

客户端操作系统(Oracle linux)字符集

客户端工具sqlplus字符集

结论1:客户端工具sqlplus的会话,使用的字符集,是数据库字符集。如果客户端用户的env环境变量设置了NLS_LANG变量,则优先使用这个变量指定的字符集。

结论2:通过客户端工具往数据库写入内容时,存储到表中的字段是按照写入时客户端工具的字符集编码进行存储的。

结论3:操作系统的环境变量LANG中字符集,对客户端工具执行sql返回的数据结果如何显示没有影响。

环境字符集

服务器

env命令查看服务器操作系统的字符集

数据库字符集

SELECT parameter, value

FROM NLS_DATABASE_PARAMETERS

WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

或者

SELECT * FROM V$NLS_PARAMETERS

WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

查看数据库字符集(NLS_CHARACTERSET)、国家字符集(NLS_NCHAR_CHARACTERSET)设置。

客户端

env命令查看客户机的字符集

使用的服务器上的客户端工具,sqlplus,所以客户端机器就是服务器机器。字符集同上。

启动sqlplus,默认会话的NLS参数如下

SELECT * FROM NLS_SESSION_PARAMETERS;

使用命令修改机器当前会话的环境变量

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"   可

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 不可

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF-8"  不可

export LANG=zh_CN.UTF8  不可

修改前,之前用sqldeveloper插入的中文显示乱码

机器会话env环境变量如下所示,已经发生变化

登录sqlplus,查看会话环境变量

实验操作

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

客户端工具字符集

默认

即当前会话字符集,登录客户端,执行SELECT * FROM NLS_SESSION_PARAMETERS;

如前截图所示,NLS_LANGUAGE、NLS_TERRITORY,推测,客户端工具sqlplus会话默认使用数据库字符集。

进一步验证,调整数据库字符集,再执行SELECT * FROM NLS_SESSION_PARAMETERS;

截图如下,已经发生了变化。

alter system set NLS_LANGUAGE='SIMPLIFIED CHINESE' scope=spfile;

alter system set NLS_TERRITORY='CHINA' scope=spfile;

SELECT * FROM V$NLS_PARAMETERS

重新执行查看sqlplus会话参数,与已经更改的数据库字符集一致

SELECT * FROM NLS_SESSION_PARAMETERS;

使用如下命令,再改回验证,完全没问题。

alter system set NLS_LANGUAGE='AMERICAN' scope=spfile;

alter system set NLS_TERRITORY='AMERICA' scope=spfile;

注意,查看调整结果时,要开启新的会话窗口,才能看到最新的调整结果。

环境变量

当sqlplus所在机器的环境变量中包含NLS_LANG环境变量时,sqlplus会话会优先获取变量值,可以查询NLS_SESSION_PARAMETERS进行验证。

设置环境变量

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"

设置前,SELECT * FROM NLS_SESSION_PARAMETERS;

调整

字符集不一致时

客户端两个窗口,一个字符集是UTF8(A)、一个字符集是ZHS16GBK(B),数据库字符集是ZHS16GBK。A和B分别向数据库中写入一条中文记录,然后A和B再读取该表中刚写入的中文记录。

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"

sqlplus test2/test2

insert into ttest values('哈哈');

commit;

 export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

sqlplus test2/test2

insert into ttest values('嘻嘻');

commit;

从以上可以看出,向数据库表中写入字段内容时,是按照客户端当时的会话字符集向数据库写入的,而与数据库字符集无关。而客户端会话读取数据库字段时,要与存储时的字符集相符,否则乱码。

字符集处理函数

dump函数

参照

https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions108.htm#i78230

select dump(c1,1016) from ttest;

该函数返回的字符集,是当前数据库的字符集,并不是存储该字段时的字符集。

客户端会话UTF8字符集,哈哈是客户端会话字符集为UTF8时写入

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8"

客户端会话ZHS16GBK字符集,嘻嘻是客户端会话字符集为ZHS16GBK时写入

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring三级缓存是如何作用的

什么是三级缓存 singletonObjects: 一级缓存,用于保存实例化、注入、初始化完成的bean实例【完全体】earlySingletonObjects: 二级缓存,用于保存实例化完成的bean实例singletonFactories: 三级缓存,用于保…

【Vue】Vue-Router(路由)

一、基本概念 路由(Route): 路由表示一个映射关系,即 URL 路径到组件的映射。在 Vue-Router 中,一个路由对象通常包含两个主要部分:path(路径)和 component(组件&#x…

java面向对象总结

java面向对象篇到这里就已经结束了,有什么不懂的地方可以逐一进行重新观看。希望大家能够从入门到起飞。 Java面向对象基础篇综合训练(附带全套源代码及逐语句分析)->基于javabeen Java面向对象进阶篇综合训练(附带全…

2024 Java 高分面试宝典 一站式搞定技术面

前言 每年9月和10月,被业界称为“金九银十”,这是人才市场一年中最活跃的时期。此时,企业为了来年的业务扩展,纷纷加大招聘力度,空缺岗位众多,招聘需求集中。同时,初秋的招聘活动也避开酷暑&am…

操作系统:高级IO

高级IO 1.关于IO IO的基本类型: I代表输入(Input): 从外部设备或来源(如键盘、鼠标、文件、网络)读取数据到计算机中。示例:用户键入的文本、从文件读取的数据、从网络接收到的数据包。 O代表输出(Output): 将计算机处理后的数据发…

git 版本回退-idea

1、选中项目,右键,打开 git历史提交记录 2、选中想要回退的版本,选择 hard(不保留版本记录) 3、最终选择强制提交(必须强制) OK,搞定

OpenCV 图像预处理—图像金字塔

文章目录 相关概念高斯金字塔拉普拉斯金字塔应用 构建高斯金字塔为什么要对当前层进行模糊?1. 平滑处理2. 减少混叠(Aliasing)3. 多尺度表示4. 图像降采样 举个栗子创建高斯金字塔和拉普拉斯金字塔,并用拉普拉斯金字塔恢复图像 相…

【PyTorch】基于YOLO的多目标检测项目(二)

【PyTorch】基于YOLO的多目标检测项目(一) 【PyTorch】基于YOLO的多目标检测项目(二) YOLO-v3网络由跨距为2的卷积层、跳跃连接层和上采样层组成,没有池化层。网络接收一幅416 * 416的图像作为输入,并提供三…

docker compose build 怎么才能只构建其中一个服务的镜像

要使用 Docker Compose 只构建其中一个特定服务的镜像&#xff0c;你可以使用以下命令&#xff1a; docker-compose build <service_name>其中 <service_name> 是你想要构建的服务名称&#xff0c;这个名称应该与你的 docker-compose.yml 文件中定义的服务名称相匹…

C++从入门到入土(三)--6个默认成员函数

目录 前言 什么是默认成员函数 构造函数 概念 特性 析构函数 概念 特性 拷贝构造函数 概念 特性 赋值运算符重载 特性 前言 很久没有更新文章了&#xff0c;最近把类和对象相关的知识重新回顾了一遍&#xff0c;打算从今天开始继续更新C从入门到入土系列。前面我们…

DVWA中SQL注入漏洞细说

SQL注入是一种安全漏洞&#xff0c;它允许攻击者通过影响Web应用程序的后端数据库。攻击者可以通过在输入字段中插入恶意SQL代码来执行非授权查询&#xff0c;从而获取或修改数据。 在开始启动SQL注入之前我们先将DVWA的安全等级调整到Low 1、我们在SQL Injection中输入 1 and…

Linux文件恢复

很麻烦 一般还是小心最好 特别恢复的时候 可能不能选择某个文件夹去扫描恢复 所以 删除的时候 用rm -i代替rm 一定小心 以及 探索下linux的垃圾箱机制 注意 一定要恢复到不同文件夹 省的出问题 法1 系统自带工具 debugfs 但是好像不能重启&#xff1f; testdisk 1、安装 …

Flink笔记整理(四)

Flink笔记整理&#xff08;四&#xff09; 文章目录 Flink笔记整理&#xff08;四&#xff09;六、Flink中的时间和窗口6.1 窗口&#xff08;Window&#xff09;窗口的概念窗口的分类窗口API概览窗口分配器窗口函数&#xff08;Window Functions&#xff09; 6.2 时间语义&…

MySQL的库操作和表操作

文章目录 MYSQLSQL语句分类服务器&#xff0c;数据库和表的关系 库操作表操作 MYSQL SQL语句分类 DDL【data definition language】 数据定义语言&#xff0c;用来维护存储数据的结构代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言&#xff0…

关键路径算法(Critical Path)

这个算法《算法导论》中并没有提及&#xff0c;很多书和博客说的有点奇怪&#xff0c;所以写本文作为笔记。 关键路径是什么 关键路径的定义非常简单&#xff1a;就是一个图中&#xff0c;权值之和最大的路径就是关键路径。 那么就可以知道关键路径不唯一。 为什么有关键路…

安装 moleculeSTM 踩坑日记

“学习 LLM &#xff0c;在大模型时代为自己存张船票”。 相信很多人都有这样的想法。那么&#xff0c;在 AI for science 领域&#xff0c;哪些 LLM 模型值得一试呢&#xff1f; 笔者认为&#xff1a; LLM 直接预测 SMILES 性质 or 直接生成 SMILES 的技术路线是行不通的。因…

搭建DNS正向解析,反向解析+搭建DNS主从架构+搭建DNS多区域+时间同步

主要在局域网中配置&#xff0c;不存在外网 正向解析&#xff1a;域名解析为IP named.conf 解决权限 named.rfc1912.zones 解决解析方式 环境准备&#xff1a;三台机器都做下面的操作 基础配置&#xff1a;网络配置&#xff0c;关闭安全架构&#xff0c;关闭防火墙&#x…

Redis常用命令第二版

目录 1. 连接 Redis 客户端 1.1 连接实例1&#xff1a; 1.2 连接实例2&#xff1a; 1.3 极速版查看键值命令&#xff1a; 1.4 获取 Redis 配置&#xff1a; 2. 启动 Redis 实例 2.1 启动实例1&#xff1a; 2.2 启动实例2&#xff1a; 2.3 启动253的实例&#xff1a; …

Linux相关指令

1.查看手册 man 3 free 2.调试 ①gcc link.c -g ②gbd a.out ③(gbd)r 运行 ④(gbd)q 退出 3.gcc demo8.c -lpthread -o demo8 //该指令将demo.c生成的a.out文件命名为demo8 。其中的-lpthread不是必须的&#xff0c;只有用到该库才输入加上。 4…/a.out 10 >>test.ret.t…