PLsql字符集问题
plsql unexpected error

PL/SQL(Procedural Language/Structured Query Language)是一种面向过程的数据库编程语言,常用于Oracle数据库管理系统中。
在进行数据库编程时,我们经常会遇到PL/SQL出现意外错误的情况。
本文将针对PL/SQL出现意外错误的原因和解决方法进行探讨。
一、可能出现意外错误的原因1.语法错误在编写PL/SQL代码时,如果存在语法错误,例如缺少结束分号、拼写错误等,就会导致意外错误的出现。
为了避免这种情况,我们应该仔细检查代码,确保语法正确无误。
2.逻辑错误有时候PL/SQL代码的逻辑可能存在问题,例如变量未正确赋值、循环条件不正确等,这些都可能导致意外错误的发生。
在编写代码时,我们应该对逻辑进行仔细思考,确保代码逻辑正确。
3.数据错误PL/SQL操作数据库时,如果涉及到数据的读取、更新、删除等操作,有可能因为数据本身的问题导致意外错误。
在这种情况下,我们需要对数据进行仔细分析,找出问题所在,并进行相应的处理。
4.环境问题有时候意外错误可能是由于环境配置不正确导致的,例如数据库连接问题、缺少权限等。
在这种情况下,我们需要排查环境配置,确保环境设置正确。
二、解决意外错误的方法1.仔细检查代码在遇到意外错误时,我们应该首先仔细检查代码,寻找可能的语法错误、逻辑错误等,并进行逐个排查,确保代码正确。
2.使用调试工具PL/SQL开发工具通常会提供调试功能,我们可以利用这些调试工具来逐步执行代码,查看变量取值、逻辑执行过程等,从而找出问题所在。
3.日志记录在代码中适当加入日志记录功能,当遇到意外错误时,可以通过日志查看程序执行过程中的各种信息,帮助快速定位问题。
4.参考冠方文档和社区论坛在解决PL/SQL意外错误时,可以参考冠方文档和社区论坛,查找相关问题的解决方法和经验,从而更快速地解决问题。
5.向同事请教有时候遇到意外错误,我们也可以向身边的同事请教,或者进行代码审查,从他人的角度来看问题,可能会有新的解决思路。
ORA-06502:PLSQL:数字或值错误:字符串缓冲区太小解决办法

ORA-06502:PLSQL:数字或值错误:字符串缓冲区太⼩解决办法1.今天写的存储过程在执⾏过程中,报如下错误。
exec PRO_T_008pro_update_add_delete(17,1,1,1,1,45.0,54.0,45.0,45.0,45.0,54.0,45.0,54.0,'⽣产⼚家','CYB10-2',54.0,45.0,25.0,1.0,45.0,25.0,1.0,45.0,25.0,1.0,45.0,1,4545.0,0,0,0,'no');begin PRO_T_008pro_update_add_delete(17,1,1,1,1,45.0,54.0,45.0,45.0,45.0,54.0,45.0,54.0,'⽣产⼚家','CYB10-2',54.0,45.0,25.0,1.0,45.0,25.0,1.0,45.0,25.0,1.0,45.0,1,4545.0,0,0,0,'no'); end;ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太⼩ORA-06512: 在 "SMART.PRO_T_008PRO_UPDATE_ADD_DELETE", line 168ORA-01422: 实际返回的⾏数超出请求的⾏数ORA-06512: 在 line 2解决办法:存储过程中定义的变量值太⼩,加⼤它的范围即可。
p_dymbh number(38);p_bbh number(38);p_upbbh number(38);原本我设置的是10过程中定义了⼀个变量 a varchar2(2); -- a的长度为2⽽在赋值时 a := '123123'; -- '123123'的长度为6这样就会出现你所遇到的问题,解决⽅法是找到变量,将其长度加⼤,注意:plsql中varchar2长度上限是4000create or replace procedure PRO_T_008pro_update_add_delete(v_jbh in number,v_jslx in number,v_qtlx in number,v_sfpfcl in number,v_ccjzt in number,v_hsl in number,v_yy in number,v_ty in number,v_hy in number,v_dym in number,v_bg in number,v_jklw in number,v_scqyb in number,v_sccj in varchar2,v_cybxh in varchar2,v_ygnj in number,v_yctgnj in number,v_yjgj in number,v_yjgjb in number,v_yjgcd in number,v_ejgj in number,v_ejgjb in number,v_ejgcd in number,v_sjgj in number,v_sjgjb in number,v_mdzt in number,v_clxs in number,v_bzgtbh in number,v_bzdntbh in number,v_id in number,v_ids in varchar2) isp_msg varchar2(300) := 'error';p_dymbh number(38);p_bbh number(38);p_upbbh number(38);beginIf v_ids <> 'no' thenEXECUTE IMMEDIATE ' delete fromT_008_OUTPUTWELLPRODUCTION t where t.jlbh in (' ||v_ids || ')';commit;p_msg := '删除成功';elsif v_id = 0 then--insert 动液⾯数据insert into T_011_DYNAMICLIQUIDLEVEL (jbh, dym) values (v_jbh, v_dym); select distinct w.jlbh as jlbhinto p_dymbhfrom T_011_DYNAMICLIQUIDLEVEL wwhere w.jbh = v_jbh;--insert 泵信息select distinct w.jlbh as jlbhinto p_bbhfrom t_023_pump wwhere w.sccj = v_sccjand w.cybxh = v_cybxh;insert into T_008_OUTPUTWELLPRODUCTION(jbh,jslx,qtlx,sfpfcl,ccjzt,hsl,yy,ty,hy,bg,jklw,scqyb,ygnj,yctgnj,yjgj,yjgjb,yjgcd,ejgj,ejgjb,ejgcd,sjgj,sjgjb,sjgcd,mdzt,clxs,bzgtbh,bzdntbh,dymbh,bbh)values(v_jbh,v_jslx,v_qtlx,v_sfpfcl,v_ccjzt,v_yy,v_ty,v_hy,v_bg,v_jklw,v_scqyb,v_ygnj,v_yctgnj,v_yjgj,v_yjgjb,v_yjgcd,v_ejgj,v_ejgjb,v_ejgcd,v_sjgj,v_sjgjb,v_sjgcd,v_mdzt,v_clxs,v_bzgtbh,v_bzdntbh,p_dymbh,p_bbh);commit;p_msg := '添加成功';elsif v_id > 0 then--修改数据update T_011_DYNAMICLIQUIDLEVEL dset d.dym = v_dymwhere d.jbh = v_jbh;select distinct w.jlbh as jlbhinto p_upbbhfrom t_023_pump wwhere w.sccj = v_sccjand w.cybxh = v_cybxh;---------------------------------------------------Update T_008_OUTPUTWELLPRODUCTION t set jbh = v_jbh,jslx = v_jslx,qtlx = v_qtlx,sfpfcl = v_sfpfcl,ccjzt = v_ccjzt,hsl = v_hsl,yy = v_yy,ty = v_ty,hy = v_hy,bg = v_bg,jklw = v_jklw,scqyb = v_scqyb,ygnj = v_ygnj,yctgnj = v_yctgnj,yjgj = v_yjgj,yjgjb = v_yjgjb,yjgcd = v_yjgcd,ejgj = v_ejgj,ejgjb = v_ejgjb,ejgcd = v_ejgcd,sjgj = v_sjgj,sjgjb = v_sjgjb,sjgcd = v_sjgcd,mdzt = v_mdzt,clxs = v_clxs,bzgtbh = v_bzgtbh,bzdntbh = v_bzdntbh,bbh=p_upbbhWhere t.jlbh = v_id;p_msg := '修改成功';end if;dbms_output.put_line('p_msg:' || p_msg); ExceptionWhen Others Thenp_msg := Sqlerrm || ',' || '操作失败';dbms_output.put_line('p_msg:' || p_msg); end PRO_T_008pro_update_add_delete;。
启动PLSQLDeveloper报字符编码不一致错误

启动PLSQLDeveloper报字符编码不一致错误启动PL/SQL Developer 报字符编码不一致错误报错:Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different.Character set conversion may cause unexpected results.Note: you can set the client character set through the NLS_LANG environment variable or the NLS_LANG registry key inHKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_Oracle_1 0g.解决方法:1)打开注册表,通过命令regedit。
找到到文中提示的路径,发现NLS_LANG键的值为: SIMPLIFIED CHINESE_CHINA.ZHS16GBK 修改为:SIMPLIFIED CHINESE_CHINA.AL32UTF8即可2)还有一种可能是由于安装11g的时候没选择自定义安装造成的Database character set (AL32UTF8) and Client character set (ZHS16GBK) are different. Character set conversion may cause unexpected results.Note: you can set the client character set through the NLS_LANG environment variable or the NLS_LANG registry key inHKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/KEY_OraDb11 g_homeSIMPLIFIED CHINESE_CHINA.ZHS16GBK 包含AMERICAN_AMERICA.AL32UTF8.这可是个麻烦事,不是改客户端字符集的问题。
在sqlplus中改变字体和字符集

问题3 在SQL*Plus中改变字体和字符集问题描述有时,SQL*Plus中显示的数据字体太小,怎样改变SQL*Plus中显示的字体大小?问题分析Oracle中所使用的SQL*Plus有两种,一种是基于MS-DOS的SQL*Plus,其对应的命令程序为sqlplus.exe,存放在D:\oracle\product\10.2.0\db_1\bin \目录下。
另一个是基于Windows的sqlplusw.exe。
由于字体的改变对MS-DOS 环境并无影响,因此,它仅对sqlplusw.exe有效,其主要原因是,在Windows 环境下启动sqlplusw.exe时,需要读取注册表,所以,更改字体的大小,只需更改注册表信息即可。
问题解答具体步骤如下。
步骤1:打开注册表定位于Oracle产品所在的入口项:hkey_local_machin e\software\oracle\ key_OraDb 10g_home1。
其中,key_OraDb 10g_home1是当前Oracle数据库服务器安装的位置,如果安装了另一个Oracle产品,则会出现HOME1,依次类推。
如图3-10所示。
图3-10 注册表编辑器步骤2:在当前注册表项下,添加两个“字符串值”。
·sqlplus_font,其值为“terminal”。
·sqlplus_font_size,其值为14,或其他大小的值,如16、18等。
步骤3:关闭注册表,启动sqlplusw.exe即可生效。
另外,与字体有关的是不同字符集数据的显示问题。
如果要更改在客户端显示的字符集,则在MS-DOS提示符下,更改参数nls_lang的字符集。
例如,将参数nls_lang设置成繁体中文(Traditional Chinese),则命令为:set nls_lang=traditional chinese_taiwan.zht16mswin950如果设置成中文简体(Simplified Chinese),则命令为:set nls_lang=simplified chinese_china.ZHS16GBK实际上,注册表中nls_lang的参数值并没有因为上面命令的执行而发生改变,其中的参数值是Oracle数据库所采用的字符集。
PLSQL设置显示的字符集及PLSQL的一些自身设置-CSDN博客

PLSQL设置显⽰的字符集及PLSQL的⼀些⾃⾝设置-CSDN博客⼀、关于PLSQL⽆法正确显⽰中⽂刚才下载安装了PLSQL Developer 9.0.0.1601 汉化绿⾊版,执⾏SQL查询语句,发现显⽰的数据中只要有中⽂都会以?表⽰。
经过⽹上查询得知这是客户端跟服务器的字符集不匹配造成的。
解决⽅法如下:1、查询oracle server端的字符集。
打开PLSQL的查询窗⼝中输⼊下⾯SQL查询语句。
select userenv('language') from dual;得到的服务器字符集为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK2、我的电脑中环境变量界⾯,在系统变量中新加:变量名:NLS_LANG变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK变量值跟服务器查询到的值⼀致即可。
由此设置步骤可得知此设置不仅仅是针对PLSQL的,所有在客服机上连接ORACLE时显⽰的中⽂为?时都必须通过这个⽅法设置其字符集与服务器上的⼀致⽅可正确显⽰中⽂内容。
⼆、PLSQL绿⾊汉化版设置软件的中⽂显⽰在PLSQL中点击菜单 tools--preferences 在弹出的设置窗⼝中找到 appearance——language 选择简体中⽂即可。
三、PLSQL登录时,在登录窗⼝中的数据库内容应如果设置这个地⽅PLSQL其实会读取⼀个⽂件,⽂件的全路径为:ORACLE客服端所在⽬录app\Administrator\product\11.2.0\client_1\Network\Admin\tnsnames.ora如我的ORACLE客户端安装在D盘则 D:\app\Administrator\product\11.2.0\client_1\Network\Admin\tnsnames.ora⼀般新装的ORACLE客户端没有这个⽂件,这个⽂件需要⾃⼰配置或通过ORACLE专门的配置程序进⾏设置。
plsql中文乱码问题解决

将上面的nls_lang配置到plsql中去。
第三种
解决PL/SQL和TOAD中文乱码问题:
regedit->hkey_local_machine->software->oracle->home0->NLS_LANG value:AMERICAN_AMERICA.WE8ISO8859P1”
select * from nls_session_parameters;
1.设置本地客户端编码:
进入 我的电脑,属性,高级,环境变量,
添加2项: LANG=zh_CN.GBK
NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" (我只配置了这一行就成功了,
select * from nls_instance_parameters;
st where t.PARAMETER =''NLS_LANGUAGE''
or t.PARAMETER =''NLS_CHARACTERSET'';
解决plsql客户端中文乱码,三种解决方法:
第一种:
在pls暗中文件下面生成一个.bat
查看数据库服务器和客户端的字符集有没有不同的:
代码如下:
select * from nls_database_parameters;
在环境变量中——“系统环境”中配置
第二种
2.更加直接的方法就是在plsql的安装文件下创建一个txt文件,文件名称为: nls_lang
代码如下: set nls_lang=simplified chinese_china.ZHS16GBK
plsql中文显示乱码解决方法

plsql 中文显示乱码。
1.HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOMEOHKEY_LOCAL_MACHINE->SOFTWARE->ORACLENLS_LANG :SIMPLIFIED CHINESE_CHINA.ZHS16GBK或SIMPLIFIED CHINESE_CHINA.UTF8设置环境变量,NLS_LANG :SIMPLIFIED CHINESE_CHINA.ZHS16GBK如果想转换为UTF8字符集,可以赋予"NLS_LANG"为"AMERICAN_AMERICA.UTF8"oracle字符集的查询:1、数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
2、客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表3、会话字符集环境select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。
如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
plsql中文显示乱码解决方法

plsql中文显示乱码解决方法1. 使用的是服务器上的,不是本机的Oracle,按下面做就可以了:设置环境变量:NLS_LANG,具体值用下面查询的值:SELECT 'AMERICAN_AMERICA.' || PROPERTY_VALUEFROM DATABASE_PROPERTIESWHERE PROPERTY_NAME = 'NLS_CHARACTERSET';2. 如果是本机的Oracle就需要在Oracle的安装目录下面改设置:有一个配置文件名为dbappscfg.properties,修改该文件即可解决上述问题。
这个文件的位置在$oracle_home\sysman\config目录下,用任何的文本编辑器打开该文件,在这个文件里面,找到这样一项,# sqlplus_nls_lang=american_america.we8iso8859p1去掉注释符#,同时将其修改为sqlplus_nls_lang=american_america.zhs16gbk。
对于windows操作系统,还需要修改一项,在文件中找到# sqlplus_systemroot=c:\\winnt40,去掉注释符,将其修改为你所在机器的操作系统主目录。
如操作系统的主目录在d盘的winnt 下,则将其修改为sqlplus_systemroot=d:\\winnt。
对于后面一项的修改只对windows操作系统进行,对unix操作系统则不需要。
如果在windows操作系统中不修改该项,在oracle enterprise manager中,连接系统时,会提示如下的错误:ora-12560 tns:protocol adapter error或者ora-12545 connect failed because target host or object does not exist修改完成后,保存文件,退出编辑。
plsqlset

解决PLSQL中文乱码问题
在日文环境下,安装PLSQL后,打开创建的数据库表,所有中文/日语汉字注释全部乱码。
如下图:
原因:
这是因为当前PLSQL所使用的编码格式和文本的编码格式不同导致的,通常在非Unicode或UTF-8的编
解决办法:
设置环境的文本编码。
在工具菜单栏下点击偏好设定菜单项,打开个人偏好设定对话框。
在左侧的列表中选择用户接口下的字
分别点击Select...按钮和Main Font...按钮,选择自己喜欢的字体,最重要的是选择文字编码设置到中文
其中欧文(西文)为默认的设置,也就是此设置导致了中文/日语汉字乱码,
应将其设置为日本语或中文等编码。
但如果你选择的字体为西文编码的,可能不会在文字编码下拉列表
那个中央什么的,不是中国语。
想要出现有关中文或日本语的选项,首先要选择一个支持该编码的字体
如上分别在四个字体设置的对话框中选择相应的字体,设置编码为日本语,点击OK,在个人偏好设置对
汉字注释全部乱码。
如下图:
,通常在非Unicode或UTF-8的编码环境下,中文等非西方文字会出现乱码。
侧的列表中选择用户接口下的字体设置(Fonts),则右侧切换到相关设置页。
如下图。
要的是选择文字编码设置到中文或日语环境。
下图为默认的设置。
,可能不会在文字编码下拉列表中出现有关中文/日本语的设置。
如下图:
先要选择一个支持该编码的字体。
如下图:
语,点击OK,在个人偏好设置对话框中点击OK,就一切OK了。
plsql unexpected error

plsql unexpected error摘要:1.PL/SQL简介2.PL/SQL错误类型3.意外错误处理方法4.提高PL/SQL代码稳定性的建议正文:【1.PL/SQL简介】PL/SQL(Procedural Language/Structured Query Language)是一种过程式编程语言,它是Oracle 数据库管理系统的一部分。
PL/SQL 主要用于编写存储过程、触发器、函数等数据库对象,以实现对数据库的高级操作和控制。
PL/SQL 代码可以嵌入到SQL 语句中,也可以作为独立的程序执行。
【2.PL/SQL错误类型】在编写PL/SQL程序时,可能会遇到各种错误,如语法错误、语义错误、运行时错误等。
其中,运行时错误是指在程序执行过程中出现的错误,包括异常和意外错误。
【3.意外错误处理方法】(1)异常处理:在PL/SQL 中,可以使用“EXCEPTION”语句来捕获和处理异常。
当程序运行过程中发生异常时,会抛出异常并转到“EXCEPTION”语句所在的位置,执行相应的异常处理逻辑。
例如:```DECLAREv_num NUMBER := 10;BEGINIF v_num > 5 THENRAISE NO_DATA_FOUND; -- 引发异常END IF;EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE("找不到数据");WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE("发生其他错误");END;```(2)意外错误处理:意外错误通常是由于程序逻辑错误、输入数据错误等原因导致的。
为了处理意外错误,可以采用以下方法:- 输入数据检查:在接收输入数据时,对数据进行有效性检查,确保输入数据符合预期。
- 程序逻辑检查:对程序逻辑进行仔细检查,确保程序执行路径正确。
exp、imp导入数据乱码、plsql中文乱码,显示问号

1.登陆plsql,执行sql语句,输出的中文标题显示成问号????;条件包含中文,
则无数据输出
2.输入sql语句select * from V$NLS_PARAMETERS查看字符集,查看第一
行value值是否为简体中文
3.进入注册表,依次单击HKEY_LOCAL_MACHINE --->SOFTWARE --->
ORACLE--->home(小编安装的是Oracle 11g,这里显示成
KEY_OraDb11g_home1),找到NLS_LANG,查看数值数据是否为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
4.如果以上设置都没有问题,那就要查看下环境变量的设置,查看是否有变量
NLS_LANG,没有则新建该变量
5.新建变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED
CHINESE_CHINA.ZHS16GBK,确定即可
6.退出plsql,重新登陆plsql。
输入sql语句,执行,中文标题终于正常显示,
也有数据输出了
注册表,NLS_LANG值与环境变量中的NLS_LANG值保持一致。
PL_SQL汉字乱码和汉字查询不识别问题(已解决)

PL_SQL汉字乱码和汉字查询不识别问题(已解决)
PL/SQL 汉字乱码和汉字查询不识别问题(已解决)
原因分析:本机字符集设置的问题,即PL/SQL所在的终端的字符集设置与Oracle服务器端的字符集设置不统一;
处理方式:
1. 查询Oracle服务器端的字符集设置。
可以通过“SELECT * FROM v$nls_parameters;”获取服务端的字符集设置,如下图:s
2. 设置本地的字符集设置;打开系统”环境变量“设置窗口,查看NLS_LANG变量,若存在则直接参照服务端的设置调整变量值,否则,新建该变量并参照赋值。
特别说明,我将变量值与服务器设置(SIMPLIFIED CHINESE_CHINA.AL32UTF8)统一后问题问题得以解决,而当我把变量值设置为(SIMPLIFIED CHINESE_CHINA.ZHS16GBK)时,问题同样得到了解决。
3. 补充说明,在环境变量配置为AL32UTF8之后,在正常的执行
数据操作(DML)时正常。
但在执行创建表(含汉字备注)脚本的时候,出现“非法字符”的提示,调整为ZHS16GBK后恢复正常。
PLSQL往Oracle数据库插入中文后变为问号 和 启动PLSQL时提示NLS_LANG在客户端不能确定的解决办法

PL/SQL向Oracle数据库输入中文后变为问号和启动PL/SQL时提示NLS_LANG在客户端不能确定的解决办法工作需要,最近在VM虚拟机里安装了Redhat Linux系统,并在Redhat里安装了Oracle10.5,接着在本地Win7系统里,通过安装Oracle Instant Client客户端和PL/SQL Developer工具,来访问Oracle进行SQL操作。
但一直遇到一个很奇怪的问题,通过PL/SQL Developer工具,不管是通过Insert into 插入的,或者通过菜单:工具-ODBC导入器导入的数据,只要包含中文的值,查询时都显示其变为“?”问号了(图1)。
图 1上网了解到这跟字符集有关,Oracle安装和导入数据时,需要Oracle的Server服务器、Client客户端以及安装环境三者的字符集编码一致,否则就会出现乱码问题。
如下图2所示,Oracle数据库的区域语言、字符集和安装环境的区域语言、字符集设置不一致,导致Oracle中文提示变为乱码:图 2通过语句:Select*from V$NLS_PARAMETERS where PARAMETER='NLS_CHARACTERSET';Select USERENV('LANGUAGE')from DUAL;可以查询到Oracle服务器正在使用是什么字符集;通过查找注册表:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\里,NLS_LANG的具体键值即可知道客户端使用的字符集(图3)。
图 3一开始检查到Oracle服务端和客户端使用的字符集不一,于是将服务端的字符集改成ZHS16GBK以保持跟客户端的一致,但输入中文以后测试发现问题还是没解决。
继续上网寻找解决办法,了解到PL/SQL Developer可以设置使用的字符集,在菜单:工具-首选项里,可能因为版本问题找了一遍没发现,倒是发现在菜单:首选项-Oracle里有一项:检查客户及与服务器字符集是否匹配(图4),马上将其勾选,确定保存后退出PL/SQL Developer,再重新打开。
SQL记录-PLSQL字符串

SQL记录-PLSQL字符串PL/SQL字符串PL/SQL字符串实际上是⼀个可选的尺⼨规格字符序列。
字符可以是数字,字母,空⽩,特殊字符或全部的组合。
PL/SQL提供了三种类型的字符串:固定长度字符串:在这样的字符串,程序员指定的长度,同时声明该字符串。
该字符串是右填充空格以达到指定的长度。
变长字符串:在这样的字符串,最⼤长度可达32,767,为字符串指定,并不需要填充。
字符⼤对象(CLOB):这是可变长度的字符串,可以达到128兆兆字节。
PL/ SQL字符串可以是变量或字⾯值。
字符串⽂字被引号围在内部。
例如,'This is a string literal. ' Or 'hello world'包括在字符串中单引号的⽂字,需要输⼊两个单引号彼此相邻,如:'this isn''t what it looks like'声明字符串变量Oracle数据库提供了⼤量的字符串数据类型,如:CHAR,NCHAR,VARCHAR2,NVARCHAR2,CLOB和NCLOB。
前⾯加上⼀个'N'的数据类型为“国家字符集”数据类型,即存储Unicode字符数据。
如果需要声明⼀个可变长度的字符串时,必须提供该字符串的最⼤长度。
例如,VARCHAR2数据类型。
下⾯的例⼦说明了声明和使⽤⼀些字符串变量:DECLAREname varchar2(20);company varchar2(30);introduction clob;choice char(1);BEGINname := 'John Smith';company := 'Infotech';introduction := ' Hello! I''m John Smith from Infotech.';choice := 'y';IF choice = 'y' THENdbms_output.put_line(name);dbms_output.put_line(company);dbms_output.put_line(introduction);END IF;END;/当上述代码在SQL提⽰符执⾏时,它产⽣了以下结果:John SmithInfotech CorporationHello! I'm John Smith from Infotech.PL/SQL procedure successfully completed要声明⼀个固定长度的字符串,使⽤CHAR数据类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进入注册表 regedit ,依次单击HKEY_LOCAL_MACHINE --->SOFTWARE ---> ORACLE--->home(小编安装的是Oracle 11g,这里显示成KEY_OraDb11g_home1),找到NLS_LANG,查看数值数据是否为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
通过此种方法来更改数据库字符集,只对更改后的数据有效,即数据库中原来的数据仍以原字符集被存储。
另外,有的还利用CREATE DATABASE CHARACTER SET ZHS16GBK命令暂时的修改字符集,当重启数据库后,数据库字符集将恢复原来的字符集。
4 常见的汉字乱码问题及解决方案
NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK export NLS_LANG
(2)客户端字符集与服务器端字符集相同,服务器端字符集与加载数据字符集不一致。这种情况一般发生在ORACLE版本升级或重新安装数据库时选择了与原来数据库不同的字符集,而恢复加载的备份数据仍是按原字符集卸出的场合。另一种情况是加载从其它使用不同字符集的ORACLE数据库卸出的数据。在这两种情况中,不管客户端字符集与服务器端字符集是否一致都无法正确显示汉字。具体解决方案:
即当前数据库使用的字符集是ZHS16GBK。
数据库服务端的字符集是在创建数据时设定的。但可通过如下方法对已设定的字符集进行修改:
方法一:重建数据库。建立数据库时将数据库的字符集设定为所需字符集。
方法二:修改SYS.PROPS$表。即用SYS用户登陆ORACLE后,利用下面语句修改相应的字符集并提交:SQL>UPDATE PROPS$ SET VALUE$=’ZHS16GBK‘WHERE NAME=’NLS_CHARACTERSET’;SQL>COMMIT;
(3)客户端字符集与服务器端字符集不同,服务端字符集与输入数据字符集不同。这种情况是在客户端字符集与服务器端字符集不一致时,从客户端输入了汉字信息。输入的这些信息即便是把客户端字符集更改正确,也无法显示汉字。解决方案:修改客户端字符集与服务端字符集一致后,重新输入数据。
5 结束语
根据ORACLE官方文档的说明,一旦数据库创建后,数据库的字符集是不能改变的。因此,提前考虑自己的数据库将选用哪一种字符集是十分重要的。数据库字符集选择的一般规则是将数据库字符集设定为操作系统本地字符集的一个超集,同时数据库字符集也应该是所有客户字符集的超集。如同样是中文环境,在选择ZHS16CGB231280还是ZHS16GBK时,我们更多的情况是选择ZHS16GBK,因为它包含了ZHS16CGB231280字符集。
territory 指定服务器的日期和数字格式
charset 指定字符集
三个成分可以任意组合,例如:
AMERICAN_7SCII
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
AMERICAN_AMERICA.ZHS16GBK
如果以上设置都没有问题,那就要查看下环境变量的设置,查看是否有变量NLS_LANG,没有则新建该变量
新建变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,确定即可
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
方案一:按服务端字符集的修改方法修改服务端字符集与加载数据字符集一致,然后导入数据。
方案二:利用数据格式转储,避开字符集带来的问题。即先将加载数据倒入到与其字符集一致的数据库中,然后再将数据要么按文本格式导出(数据量较小的情况下),要么通过第三方工具(如POWER BUILDER,ACCESS,FOXPRO等)倒出数据,最后将倒出的数据导入到目标数据库中。
NLS_TERRITORY CHINA
NLS_CHARACTERSET ZHS16GBK
第二步:根据服务端的字符集设定客户端的字符集,设定方法参见客户端的字符集的设定方式。以UNIX系统为例,可在当前用户的profile文件中增加如下两行:
1 引言
ORACLE数据库作为业界领先的数据库产品,近年来在国内大中型企业中得到了广泛的应用。虽然ORACLE数据库产品本身在本地化方面已做得相当成熟,但还是有不少用户反应汉字显示乱码的问题。如对同一数据库不同的用户对同一表中的username查询却得出了不同的结果: “ORACLE??????”和“ORACLE中国有限公司”,显然结果中将中文字符显示为乱码,那么为什么呢?字符集的设置不当是影响ORACLE数据库汉字显示的关键问题。
3 字符集的构成与设定
字符集的构成与设定方式分为客户端与服务器端两种:
(1)客户端字符集的构成与设定。客户端的字符集是由当前用户的环境变量NLS_LANG设定的。环境变量NLS_LANG的构成:NLS_LANG=language_territory.charset
其中:language 指定服务器消息的语言
PARAMETER VALUE
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CHARACTERSET ZHS16GBK
客户端字符集的设定方法针对不同操作系统设定方法稍有不同:
WINDOWS系统是在注册表项:HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0/NLS_LANG中设定;
UNIX系统是在当前用户的环境变量中设定,如在当前用户的profile文件中增加一行如下代码:
NLS_LANG=SIMPLIFIED Chinese_CHINA.ZHS16GBK;export NLS_LANG
(2)服务端字符集的构成与设定。服务端字符集的构成体现在数据字典表V$NLS_PARAMETERS的NLS_LANGUAGE、NLS_TERRITORY、NLS_CHARACTERSET三项取值上,其中NLS_CHARACTERSET的取值就是具体的数据库字符集。如利用查询语句SQL>SELECT * FROM V$NLS_PARAMETERS;可得到如下结果:
第一步:查询V$NLS_PARAMETERS得到服务端的字符集:SQL>SELECT * FROM V$NLS_PARAMETERS;
PARAMETER VALUE
NLS_LANGUAGE SIMPLIFIED CHINESE
2 关于字符集
字符集是ORACLE为适应不同语言文字显示而设定的。用于汉字显示的字符集主要有ZHS16CGB231280、ZHS16GBK、US7ASCII和UTF-8等。字符集同时存在于服务器端和客户端。服务器端字符集是在安装ORACLE时指定的,字符集登记信息存储在ORACLE数据库字典的V$NLS_PARAMETERS表中;而客户端字符集是在系统注册表(WINDOWS系统)或在用户的环境变量(UNIX系统)中设定的。
参考文献
1.(美)JONATHAN GENNICK CAROL MCCULLOUGH-DIETER GERRIT-JAN LINKER ,译者:赵艳勤, 刘冠英, 秦玉杰 等.《ORACLE8I DBA宝典》.电子工业出版社
2.JASON COUCHMAN,SUDHEER MARISETTI.《OCP ORACLE9I DATABASE:FUNDAMENTALS I EXAM GUIDE》.出版社: MCGRAW-HILL
3.ORACLE Corporation.ORACLE 9i Database Administration Fundamentas I Student Guide》
要在客户端正确显示ORACLE数据库中的汉字信息数据库的数据字符集必须与服务器字符集一致。据此,汉字显示乱码的问题大致可以分为以下几种情况:
(1)客户端字符集与服务器端字符集不同,服务器端字符集与加载数据字符集一致。这种情况是最常见的,只要把客户端的字符集设置正确即可。具体解决方案:
摘 要
字符集的设置不当是影响ORACLE数据库汉字显示的关键问题。本文从实践经验出发,介绍了ORACLE关于字符集的分类、构成及设定方法,分析了ORACLE数据库汉字显示乱码的常见现象及原因,并针对各种现象及原因提出了行之有效的解决办法。
关键字: ORACLE 字符集 中文 乱码 解决 UTF-8