oracle字符集问题

[复制链接]
查看11 | 回复9 | 2013-9-13 11:40:13 | 显示全部楼层 |阅读模式
NLS_LANG设置应该是和客户端的字符集是一致的,用于告诉oracle我的客户端的字符集是什么,oracle根据需要进行转码和编码进行存储。我的机器:
db111@dbrac1/home/oracle$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

设置NLS_LANG=american_america.utf8
数据库字符集为:
PARAMETER
VALUE
------------------------------ ------------------------------
NLS_LANGUAGE
SIMPLIFIED CHINESE
NLS_TERRITORY
CHINA
NLS_CURRENCY
?
NLS_ISO_CURRENCY
CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET
ZHS16GBK
NLS_CALENDAR
GREGORIAN
NLS_DATE_FORMAT
DD-MON-RR
NLS_DATE_LANGUAGE
SIMPLIFIED CHINESE
NLS_SORT
BINARY
NLS_TIME_FORMAT
HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT
HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMATDD-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
11.2.0.1.0

按理说,oracle在存储的时候应该先把utf8的编码转换成zhs16gbk然后再进行存储,这种设置是正确的吧!
但是,我新建一个触发器
如下:
CREATE OR REPLACE TRIGGER tr_dept_time
BEFORE INSERT OR DELETE OR UPDATE
ON test
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日')) OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改departments表');
END IF;
END;

查询的时候显示的为什么是乱码呢?
SQL> select TRIGGER_BODY from user_triggers;
TRIGGER_BODY
--------------------------------------------------------------------------------
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('锛燂紵??', '锛燂紵锛)) OR (TO_CHAR(sysdate, 'HH24:
MI') NOT BETWEEN '08:30' AND '18:00') THEN
RAISE_APPLICATION_ERROR(-20001, '??锛燂紵?锛锛?锛燂紵?锛焑partments?锛
END IF;
END;

求大神指教!!!

回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
用的什么测试的?SECURECRT?设置下工具的字符集
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
客户端NLS_LANG应该和数据库服务器设置成一致,数据库客户端发现NLS_LANG和操作系统不一致时,会先转码,再发到数据库服务器保存。你可以把NLS_LANG设成ZHS16GBK,应该就不会有乱码。
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
数据库,客户端,客户端软件字符集统一就好了
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
westzq1984 发表于 2014-1-8 22:07
用的什么测试的?SECURECRT?设置下工具的字符集

用的crt,他的字符集应该是和客户端的是一样的吧?设置了不行
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
螺湾小成 发表于 2014-1-8 22:25
客户端NLS_LANG应该和数据库服务器设置成一致,数据库客户端发现NLS_LANG和操作系统不一致时,会先转码,再 ...

NLS_LANG是告诉数据库客户端是什么字符集吧,然后数据库根据需要转码进行存储。所以NLS_LANG应该和客户端的字符集是一样的啊
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
遗忘的deny 发表于 2014-1-9 09:31
数据库,客户端,客户端软件字符集统一就好了

客户端软件就是sqlplus,sqlplus没有字符集吧?
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
huashnag 发表于 2014-1-9 10:00
用的crt,他的字符集应该是和客户端的是一样的吧?设置了不行

工具的设置里面。不是LANG.
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
westzq1984 发表于 2014-1-9 13:27
工具的设置里面。不是LANG.

对,是在工具里面设置的C:\Users\hxy\Desktop\QQ截图20140109145018.png
回复

使用道具 举报

千问 | 2013-9-13 11:40:13 | 显示全部楼层
huashnag 发表于 2014-1-9 10:06
NLS_LANG是告诉数据库客户端是什么字符集吧,然后数据库根据需要转码进行存储。所以NLS_LANG应该和客户端 ...

那你把NLS_LANG设成ZHS16GBK,可以正常显示吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行