oracle查询本身字符集,Oracle字符集问题总结

有过一些Oracle使用经验的朋友,大多会知道通过NLS_LANG来设置客户端的情况,NLS_LANG由以下部分组成:NLS_LANG=_.,其中第三部分的本意就是用来指明客户端操作系统缺省使用的字符集。所以按正规的用法,NLS_LANG应该按照客户端机器的实际情况进行配置,尤其对于字符集一项更是如此,这样Oracle就能够在最大程度上实现数据库字符集与客户端字符集的自动转换(当然是如果需要转换的话)。总结一下第一次迭代的重点:字符集:将特定的符号集编码为计算机能够处理的数值;字符集间的转换:对于在源字符集与目标字符集都存在的符号,理论上转换将不会产生信息丢失;而对于在源字符集中存在而在目标字符集中不存在的符号,理论上转换将会产生信息丢失;数据库字符集:选择能够包含所有将要存储的信息符号的字符集;客户端字符集设置:指明客户端操作系统缺省使用的字符集。第二次迭代:通过实例加深对基本概念的理解下面我将引用网友tellin在ITPUB上发表的“CHARACTER SET研究及疑问”帖子,该朋友在帖子中列举了他做的相关实验,并对实验结果提出了一些疑问,我将对他的实验结果进行分析,并回答他的疑问。实验结果分析一quote:--------------------------------------------------------------------------------最初由 tellin 发布设置客户端字符集为US7ASCIID:\>SET NLS_LANG=AMERICAN_AMERICA.US7ASCII查看服务器字符集为US7ASCIISQL> SELECT * FROM NLS_DATABASE_PARAMETERS;PARAMETER VALUE------------------------------ ----------------------------------------NLS_CHARACTERSET US7ASCII建立测试表SQL> CREATE TABLE TEST (R1 VARCHAR2(10));Table created.插入数据SQL> INSERT INTO TEST VALUES('东北');1 row created.SQL> SELECT * FROM TEST;R1----------东北SQL> EXIT--------------------------------------------------------------------------------这一部分的实验数据的存取与显示都正确,好象没什么问题,但实际上却隐藏着很大的隐患。首先,要将汉字存入数据库,而将数据库字符集设置为US7ASCII是不合适的。US7ASCII字符集只定义了128个符号,并不支持汉字。另外,由于在SQL*PLUS中能够输入中文,操作系统缺省应该是支持中文的,但在NLS_LANG中的字符集设置为US7ASCII,显然也是不正确的,它没有反映客户端的实际情况。但实际显示却是正确的,这主要是因为Oracle检查数据库与客户端的字符集设置是同样的,那么数据在客户与数据库之间的存取过程中将不发生任何转换。具体地说,在客户端输入“东北”,“东”的汉字的编码为182(10110110)、171(10101011),“北”汉字的编码为177(10110001)、177(10110001),它们将不做任何变化的存入数据库中,但是这实际上导致了数据库标识的字符集与实际存入的内容是不相符的,从某种意义上讲,这也是一种不一致性,也是一种错误。而在SELECT的过程中,Oracle同样检查发现数据库与客户端的字符集设置是相同的,所以它也将存入的内容原封不动地传送到客户端,而客户端操作系统识别出这是汉字编码所以能够正确显示。在这个例子中,数据库与客户端的设置都有问题,但却好象起到了“负负得正”的效果,从应用的角度看倒好象没问题。但这里面却存在着极大的隐患,比如在应用length或substr等字符串函数时,就可能得到意外的结果。另外,如果遇到导入/导出(import /export)将会遇到更大的麻烦。有些朋友在这方面做了大量的测试,如eygle研究了“源数据库字符集为US7ASCII,导出文件字符集为US7ASCII或ZHS16GBK,目标数据库字符集为ZHS16GBK”的情况,他得出的结论是 “如果的是在Oracle92中,我们发现对于这种情况,不论怎样处理,这个导出文件都无法正确导入到Oracle9i数据库中”、“对于这种情况,我们可以通过使用Oracle8i的导出工具,设置导出字符集为US7ASCII,导出后修改第二、三字符,修改 0001 为0354,这样就可以将US7ASCII字符集的数据正确导入到ZHS16GBK的数据库中”。我想对于这些结论,这样理解可能更合适一些:由于ZHS16GBK字符集是US7ASCII的超级,所以如果按正常操作,这种转换应该没有问题;但出现问题的本质是我们让本应只存储英文字符的US7ASCII数据库,非常规地存储了中文信息,那么在转化过程中出现错误或麻烦就没什么奇怪的了,不出麻烦倒是有些奇怪了。所以说要避免这种情况,就是要在建立数据库时选择合适的字符集,不让标签(数据库的字符集设置)与实际(数据库中实际存储的信息)不符的情况发生。实验结果分析二quote:--------------------------------------------------------------------------------[ 更改客户端字符集为ZHS16GBKD:\>SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBKD:\>SQLPLUS "/ AS SYSDBA"无法正常显示数据SQL> SELECT * FROM TEST;R1--------------------6+11疑问1:ZHS16GBK为US7ASCII的超集,为什么在ZHS16GBK环境下无法正常显示--------------------------------------------------------------------------------这主要是因为Oracle检查发现数据库设置的字符集与客户端配置字符集不同,它将对数据进行字符集的转换。数据库中实际存放的数据为182(10110110)、171(10101011)、177(10110001)、177(10110001),由于数据库字符集设置为US7ASCII,它是一个7bit的字符集,存储在8bit的字节中,则Oracle忽略各字节的最高bit,则182(10110110)就变成了54(0110110),在ZHS16GBK中代表数字符号“6”(当然在其它字符集中也是“6”),同样过程也发生在其它3个字节,这样“东北”就变成了“6+11”。实验结果分析三quote:--------------------------------------------------------------------------------最初由 tellin 发布用ZHS16GBK插入数据SQL> INSERT INTO TEST VALUES('东北');1 row created.SQL> SELECT * FROM TEST;R1--------------------6+11??SQL> EXIT--------------------------------------------------------------------------------当客户端字符集设置为ZHS16GBK后向数据库插入“东北”,Oracle检查发现数据库设置的字符集为US7ASCII与客户端不一致,需要进行转换,但字符集ZHS16GBK中的“东北”两字在US7ASCII中没有对应的字符,所以Oracle用统一的“替换字符”插入数据库,在这里为“?”,编码为63(00111111),这时,输入的信息实际上已经丢失,不管字符集设置如何改变(如下面引用的实验结果),第二行SELECT出来的结果也都是两个“?”号(注意是2个,而不是4个)。quote:--------------------------------------------------------------------------------更改客户端字符集为US7ASCIID:\>SET NLS_LANG=AMERICAN_AMERICA.US7ASCIID:\>SQLPLUS "/ AS SYSDBA"无法显示用ZHS16GBK插入的字符集,但可以显示用US7ASCII插入的字符集SQL> SELECT * FROM TEST;R1----------东北??更改服务器字符集为ZHS16GBKSQL> update props$ set value$='ZHS16GBK' WHERE NAME='NLS_CHARACTERSET';1 row updated.SQL> COMMIT;更改客户端字符集为ZHS16GBKD:\>SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBKD:\>SQLPLUS "/ AS SYSDBA"可以显示以前US7ASCII的字符集,但无法显示用ZHS16GBK插入的数据,说明用ZHS16GBK插入的数据为乱码。SQL> SELECT * FROM TEST;R1--------------------东北??--------------------------------------------------------------------------------需要指出的是,通过“update props$ set value$='ZHS16GBK' WHERE NAME='NLS_CHARACTERSET';”来修改数据库字符集是非常规作法,很可能引起问题,在这里只是原文引用网友的实验结果。

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

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

相关文章

gdb 没有那个文件或目录_阿黛尔暴瘦变回粉丝喜爱的那个她,依然那样楚楚动人...

阿黛尔(Adele)在《第六夜现场》(Saturday Night Live)主持中首次亮相,穿搭风格再次让人眼前一亮参加15届格莱美奖得主阿黛尔出生于伦敦,已经32岁了,她的R&B音乐获得了两项格莱美奖,在获奖后在表示,她真的不敢相信她…

php 短信验证码对比,php短信验证码的3个优势,你知道是什么吗?

为确保个人用户的合法权益不受损害,也为了确保平台的正常运营,现在各大行业都会通过php短信验证码进行身份验证,比如大家在申请支付宝账号、注册自媒体帐号或者是办理游戏帐号时,都需要先通过php短信验证码审核用户身份后才可继续…

iphonex售价_库克也非常无奈!颁发新规后:依旧未能阻止苹果12的售价大跳水

【11月2日讯】相信大家都知道,苹果在发布了iPhone 12系列手机之后,为了改变以往iPhone手机首发售价就“破发”的尴尬局面,也是直接颁发了新规,限制了国内补贴力度最强的某电商平台—某多多,试图通过重新掌控供应链渠道…

oracle 会话 临时表,Oracle 学习系列之二(会话与事务级临时表)

--创建会话临时表create global temporary table tmp_user_session(user_id int, user_name varchar2(20),user_email varchar2(30))--这句表示 当事务提交时 保留数据on commit preserve rows--向临时表中插入数据insert into tmp_user_session(user_id,user_name,user_email)…

鼠标连点器电脑版_最值得买的鼠标垫推荐-最佳长款桌垫鼠标垫排行榜【2020年10月】...

超大鼠标垫可以将键盘、鼠标都垫着,大而厚实,操作电脑时更方便,不会出现鼠标垫不够用的情况,而且超大鼠标垫还可作为桌垫,美观大方,适合在家使用。今天给大家推荐最佳长款桌垫鼠标垫排行,希望对大家选购鼠标垫有帮助。第一名 美商海盗船|MM300战场风桌垫海盗船的产品…

mybatis调用oracle过程,使用MyBatis调用Oracle存储过程

一、Oracle存储过程存储过程代码:create or replace procedure TEST_DEMO_PROC(param_name IN VARCHAR2, return_result OUT VARCHAR2) isbeginreturn_result : Hello || param_name;end TEST_DEMO_PROC;/测试存储过程:declare result varchar2(100);be…

superoneclick 2.2_减排二氧化碳2.2万吨!“电能替代”助安吉传统产业绿色转型

近日,安吉县孝丰镇丰缘茶场的茶农夏亚红联系上了国网安吉县供电公司的工作人员,希望对方再来指导一下新安装设备的使用和操作。作为安吉县“节能贷”的用户,夏亚红成为该公司推出的茶农专变新服务的首位受益人,她坦言明年炒茶旺季…

linux的内核和发行版本号,【编测编学】linux内核及发行版本相关知识

之前很多孩子就和我说老师我会linux,我就会反问,你学软件测试,你会linux你知道linux的东西如何和企业结合吗?不是你只会一些cd、chmod、chown、ps、find、tar、vim、vi等等就可以说自己会linux的!!&#xf…

c# spire.xls 设置文字为微软雅黑_只要一分钟,给你的PPT文字加上拼音和声调

每天下午一点,PPT技能进步一点做PPT时必不可少的一项就是字体使用合适的字体可以让我们的PPT更加美观见惯了满屏幕的宋体和微软雅黑你也许想要尝试一下其他的方式来装点的文字何不用拼音?都知道在一些低年级的PPT中会给文字添加拼音相信很多看过语文老师…

linux 查看当前表空间大小,查看表空间和表的使用率

1.查看表空间使用率--查询表空间的总容量select tablespace_name,sum(bytes) /1024/1024 as MB from dba_data_files group by tablespace_name;--查询表空间使用率select total.tablespace_name,round(total.MB, 2) as Total_MB,round(total.MB - free.MB, 2) as Used_MB,roun…

xgboost 怎么读_南宁日语培训考级怎么选_在线日语学习

摘要: 南宁日语培训考级怎么选_在线日语学习为你介绍口语学习,听力先行。要先有输入,再有输出。要想有一口规范的日语口语发音,有必要先许多做听力练习。当你的耳朵熟悉了每个单词的发音,你才有时机说出规范的日语。听…

linux expect 扩容磁盘,openstack VM 磁盘扩容,修复 GPT 分区,更新分区表后,拉伸文件系统...

openstack VM 磁盘扩容,修复 GPT 分区,更新分区表后,拉伸文件系统2014-06-23 分类:Hardware 标签:Openwrt Route起因之前,厂里 openstack 虚拟机,「云主机类型」不同模板定义的磁盘大小。是在原…

glsl shader 雪_深夜食堂里的雪平锅,美味秘诀:手工打造,高效导热,煮煲炸蒸都好用!...

hello,看今天内容之前生活妹给大家推荐一下各种好吃好用的↓↓↓在日本,几乎每个家庭都有一个雪平锅。日本厨师冨田唯介甚至专门为雪平锅撰写了一本书:《雪平锅无油料理》,里面详细讲诉了雪平锅能做的各类美食,从煮物到…

ansole终端链接linux,基于Linux系统的智能家居远程控制系统设计论文.doc

基于Linux系统的智能家居远程控制系统设计论文学科分类号 0801北京邮电大学毕业论文题目 (中文):基于Linux系统的智能家居远程控制系统设计 (英文):The smart home remote control system based on Linux system design姓 名学 号8 院 (系)计算机与通信工…

ubuntu 安装GPU黑屏 修改GRUB_Ubuntu升级安装最新内核的方法与注意事项(以18.04为例)...

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习前言本文主要如何安全地升级Ubuntu内核,以18.04 Server版为例纂写本教程。我们先来了解一下什么是主线内核构建(Mainline Ke…

linux配置网卡自动获取的命令,linux 命令行下配置网卡自动获取 IP

linux 下配置网络,最方便的还是用图形界面,然而有时候必须在命令行下操作,我知道可以通过 ifconfig 设置 ip (192.168.1.20) 和掩码,route 添加网关(192.168.1.1), /etc/resolv.conf 中指定 DNS,比如&#…

send tcp char far_TCP/IP之传输层详解

1. 传输层特征传输层位于TCP/IP协议族中的第4层,负责在网络主机中创建虚拟传输控制协议TCP,或用户数据报协议UDP,也叫“Transport Layer”。此层向其主机上运行的应用程序发送和接收数据。传输层将端口号分配给在主机上的应用程序中运行的进程…

linux 从光盘安装数据,LINUX访问光盘数据

实验01:访问光盘数据实验目标熟练linux光盘的安装访问光盘的数据实验步骤[rootlocalhost ~]# umount /dev/cdrom[rootlocalhost ~]# ls /media/[rootlocalhost~]#二.手动挂载1.指定光盘安装位置[rootlocalhost~]# mount /dev/cdrom /media/mount:block d…

python库_Python 基本功: 2. 学会调用库

在完成 基本功教程1 之后:多多教Python:Python 基本功: 1. Hello world​zhuanlan.zhihu.com你已经成功完成了第一个 Python 应用程序,并且运用了三种不同的创作工具。接下来,我们先来从宏观的角度了解一下 Python 宇宙&#xff0…

arm linux 加载.a,如何将libc.a链接到arm-linux中的共享库中使用arm-none-linux-gnueabi-gcc...

在一个项目中,我的同事创建了一个静态库,例如liba.a,它与app链接.在liba.a中,他将libc malloc()覆盖为其所有者版本.我创建了一个共享库libs.so,它也与app链接.问题是当我的libs.so与app链接时,我的libs.so中使用的malloc()将是liba.a中的那个,而不是标准libc.so中的那个,这会导…