oracle如何检测乱码,oracle查询数据乱码

oracle数据库表中某个字段已存在汉字乱码,怎样查找出这些乱码数据,

查询数据库表某字段含“乱码”的数据的一个方法

超过十多年行业经验,技术领先,服务至上的经营模式,全靠网络和口碑获得客户,为自己降低成本,也就是为客户降低成本。到目前业务范围包括了:网站建设、成都做网站,成都网站推广,成都网站优化,整体网络托管,微信平台小程序开发,微信开发,手机APP定制开发,同时也可以让客户的网站和网络营销和我们一样获得订单和生意!

说明:

在某些情况下,由于字符集不兼容等问题,数据库中的记录可能存在“乱码”,本文就是介绍一个SQL语句把乱码的记录找到。

什么是“乱码”

这是首先需要明确的,其实如果数据库记录了“半个汉字”实际他只会记录一个“?”(Oracle),如果记录的乱码恰好变成另外一个“汉字”和残余字符,那这个新的“汉字”是不能用下面的方法找出来的。

适用范围

查找记录中是否含有ascii码(特别是“?”)的方式找到“乱码”的记录。

SQL模板

Select

*

from

Table_A

t

Where

instr(Name,chr(1))0

or

instr(Name,chr(2))0

or

instr(Name,chr(3))0

or

instr(Name,chr(4))0

or

instr(Name,chr(5))0

or

instr(Name,chr(6))0

or

instr(Name,chr(7))0

or

instr(Name,chr(8))0

or

instr(Name,chr(9))0

or

instr(Name,chr(10))0

or

instr(Name,chr(11))0

or

instr(Name,chr(12))0

or

instr(Name,chr(13))0

or

instr(Name,chr(14))0

or

instr(Name,chr(15))0

or

instr(Name,chr(16))0

or

instr(Name,chr(17))0

or

instr(Name,chr(18))0

or

instr(Name,chr(19))0

or

instr(Name,chr(20))0

or

instr(Name,chr(21))0

or

instr(Name,chr(22))0

or

instr(Name,chr(23))0

or

instr(Name,chr(24))0

or

instr(Name,chr(25))0

or

instr(Name,chr(26))0

or

instr(Name,chr(27))0

or

instr(Name,chr(28))0

or

instr(Name,chr(29))0

or

instr(Name,chr(30))0

or

instr(Name,chr(31))0

or

instr(Name,chr(32))0

or

instr(Name,chr(33))0

or

instr(Name,chr(34))0

or

instr(Name,chr(35))0

or

instr(Name,chr(36))0

or

instr(Name,chr(37))0

or

instr(Name,chr(38))0

or

instr(Name,chr(39))0

or

instr(Name,chr(40))0

or

instr(Name,chr(41))0

or

instr(Name,chr(42))0

or

instr(Name,chr(43))0

or

instr(Name,chr(44))0

or

instr(Name,chr(45))0

or

instr(Name,chr(46))0

or

instr(Name,chr(47))0

or

instr(Name,chr(48))0

or

instr(Name,chr(49))0

or

instr(Name,chr(50))0

or

instr(Name,chr(51))0

or

instr(Name,chr(52))0

or

instr(Name,chr(53))0

or

instr(Name,chr(54))0

or

instr(Name,chr(55))0

or

instr(Name,chr(56))0

or

instr(Name,chr(57))0

or

instr(Name,chr(58))0

or

instr(Name,chr(59))0

or

instr(Name,chr(60))0

or

instr(Name,chr(61))0

or

instr(Name,chr(62))0

or

instr(Name,chr(63))0

or

instr(Name,chr(64))0

or

instr(Name,chr(65))0

or

instr(Name,chr(66))0

or

instr(Name,chr(67))0

or

instr(Name,chr(68))0

or

instr(Name,chr(69))0

or

instr(Name,chr(70))0

or

instr(Name,chr(71))0

or

instr(Name,chr(72))0

or

instr(Name,chr(73))0

or

instr(Name,chr(74))0

or

instr(Name,chr(75))0

or

instr(Name,chr(76))0

or

instr(Name,chr(77))0

or

instr(Name,chr(78))0

or

instr(Name,chr(79))0

or

instr(Name,chr(80))0

or

instr(Name,chr(81))0

or

instr(Name,chr(82))0

or

instr(Name,chr(83))0

or

instr(Name,chr(84))0

or

instr(Name,chr(85))0

or

instr(Name,chr(86))0

or

instr(Name,chr(87))0

or

instr(Name,chr(88))0

or

instr(Name,chr(89))0

or

instr(Name,chr(90))0

or

instr(Name,chr(91))0

or

instr(Name,chr(92))0

or

instr(Name,chr(93))0

or

instr(Name,chr(94))0

or

instr(Name,chr(95))0

or

instr(Name,chr(96))0

or

instr(Name,chr(97))0

or

instr(Name,chr(98))0

or

instr(Name,chr(99))0

or

instr(Name,chr(100))0

or

instr(Name,chr(101))0

or

instr(Name,chr(102))0

or

instr(Name,chr(103))0

or

instr(Name,chr(104))0

or

instr(Name,chr(105))0

or

instr(Name,chr(106))0

or

instr(Name,chr(107))0

or

instr(Name,chr(108))0

or

instr(Name,chr(109))0

or

instr(Name,chr(110))0

or

instr(Name,chr(111))0

or

instr(Name,chr(112))0

or

instr(Name,chr(113))0

or

instr(Name,chr(114))0

or

instr(Name,chr(115))0

or

instr(Name,chr(116))0

or

instr(Name,chr(117))0

or

instr(Name,chr(118))0

or

instr(Name,chr(119))0

or

instr(Name,chr(120))0

or

instr(Name,chr(121))0

or

instr(Name,chr(122))0

or

instr(Name,chr(123))0

or

instr(Name,chr(124))0

or

instr(Name,chr(125))0

or

instr(Name,chr(126))0

or

instr(Name,chr(127))0

Oracle数据出现中文乱码怎么解决

1. 服务器指定字符集与客户字符集不同,而与加载数据字符集一致。

解决方法:对于这种情况,只需要设置客户端字符集与服务器端字符集一致就可以了,具体操作如下:

* 查看当前字符集:

SQL select * from sys.props$

2 WHERE NAME=‘NLS_CHARACTERSET’;

NAME value$

NLS_CHARACTERSET ZHS16GBK

可以看出,现在服务器端Oracle数据库的字符集为‘ZHS16GBK’

* 根据服务器的字符集在客户端作相应的配置或者安装Oracle的客户端软件时指定:

如果还没安装客户端,那么在安装客户端时,指定与服务器相吻合的字符集即可;如果已经安装好了客户端,并且客户端为 sql*net 2.0 以下版本,进入Windows的系统目录,编辑oracle.ini文件,用US7ASCII替换原字符集,重新启动计算机,设置生效;否则,如果,客户端为 sql*net 2.0 以上版本,在Win98 下 运 行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 Oracle, 第四步选择 NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集

(本例为:HKEY_LOCAL_MACHINE/

SOFTWARE/ORACLE/NLS_LANG :AMERICAN _ AMERICA. ZHS16GBK)。

如果是UNIX客户端,则:

SQL conn / as sysdba

Connected.

SQL SQL UPDATE sys.PROPS$ SET value$=‘SIMPLIFIED CHINESE’

2 WHERE NAME=‘NLS_LANGUAGE’;

2. 服务器指定字符集与客户字符集相同,与加载数据字符集不一致。

解决方法:强制加载数据字符集与服务器端字符集一致。要做到这一点,可以通过重新创建数据库,并选择与原卸出数据一致的字符集,然后IMP数据,这种情况仅仅适用于空库和具有同一种字符集的数据。

解决这类问题,也可以先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的Oracle数据库中,这样就避免了Oracle字符集的困扰。目前数据库格式转换的工具很多,像power builder5.0以上版本提供的pipeline及Microsoft Access数据库提供的数据导入/导出功能等。

3. 服务器指定字符集与客户字符集不同,与输入数据字符集不一致。

对于这种情况,目前为止都还没有太好的解决方法。

通过上面的了解,我们知道,导致在后期使用数据库时出现种种关于字符集的问题,多半是由于在数据库设计、安装之初没有很好地考虑到以后的需要,所以,我们完全可以通过在服务器上和客户端使用相同的字符集来避免由此类问题引出的麻烦

怎样修改查看Oracle字符集

a.数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。

b.客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,

表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

c.会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。

客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session环境变量注册表参数文件

实际情况

我用select * from nls_database_parameters

PARAMETER VALUE

------------------------------ ------------------------------

NLS_LANGUAGE AMERICAN

NLS_TERRITORY AMERICA

NLS_CURRENCY $

NLS_ISO_CURRENCY AMERICA

NLS_NUMERIC_CHARACTERS .,

NLS_CHARACTERSET ZHS16GBK

NLS_CALENDAR GREGORIAN

NLS_DATE_FORMAT DD-MON-RR

NLS_DATE_LANGUAGE AMERICAN

NLS_SORT BINARY

NLS_TIME_FORMAT HH.MI.SSXFF AM

PARAMETER VALUE

------------------------------ ------------------------------

NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY $

NLS_COMP BINARY

NLS_LENGTH_SEMANTICS BYTE

NLS_NCHAR_CONV_EXCP FALSE

NLS_NCHAR_CHARACTERSET AL16UTF16

NLS_RDBMS_VERSION 10.2.0.1.0

说明我在创建数据库时指定的字符集是ZHS16GBK,我用

update sys.props$ set value$='AL32UTF8' where name='NLS_CHARACTERSET';

修改了字符集,但插入中文时仍然有问题,这或许就如上面资料所说的通过修改SYS.PROPS$来修改主要是对应客户端的显示,与存储无关,

所以仍旧是乱码。

然后我重新创建了个数据库,指定字符集为AL32UTF8,插入中文就没问题了。

可见我们如果要在数据库中显示中文,在创建数据库时一定哟指定好所用的字符集。

如何解决插入Oracle数据中文为乱码问题

1、首先,Oracle查询编码:select * from v$nls_parameters;//看看是否GBK

2、如果是用Servlet或者别的,插入数据之前输出一下,看看是否乱码。

比如:

doPost()

//设置接受编码,但你的页面也必须是UTF-8

response.setContentType("text/html;charset=UTF-8");

doGet()

//下面方式转一下码

String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");


新闻名称:oracle如何检测乱码,oracle查询数据乱码
网址分享:http://abwzjs.com/article/hccijj.html