问关于chr()函数问题

gufen 2009-09-11 03:16:18
select chr(217) from dual;
返回:Ù

但是:
declare
v_var1 varchar2(10) := null;
begin
v_var1 := v_var1||chr(217);
if v_var1 is null then
dbms_output.put_line('null');
else
dbms_output.put_line('not null');
dbms_output.put_line(v_var1);
end if;
end;
返回:null

这是何故阿?谢谢解答!
...全文
104 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gufen 2009-09-13
  • 打赏
  • 举报
回复
sybase上null与任何字符相连都是为null,但oracle不是这样的。
算了,不钻牛角尖了,我考虑其它方法来加密。
谢谢你们,结帖了。
小灰狼W 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ojuju10 的回复:]
null与任何字符相连都是为null

所以最后输出为null
[/Quote]

错,你可以执行
select null||'ok' from dual
试试
ojuju10 2009-09-11
  • 打赏
  • 举报
回复
null与任何字符相连都是为null

所以最后输出为null
小灰狼W 2009-09-11
  • 打赏
  • 举报
回复
楼主就别管这个了,这个符号比较生僻,一般情况下不会出现这种情况
要用的话就用chr(43188)代替吧
shiyiwan 2009-09-11
  • 打赏
  • 举报
回复
许是bug也不定
gufen 2009-09-11
  • 打赏
  • 举报
回复
刚才是中文简体的字符集是null,不过和你一样的字符集上运行也是null,只能怀疑版本问题了,但一个版本号就这么大区别?搞不懂~
shiyiwan 2009-09-11
  • 打赏
  • 举报
回复
SQL> select * from NLS_SESSION_PARAMETERS where rownum <= 20;

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
gufen 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wildwave 的回复:]
估计是字符集的问题
[/Quote]

我也觉得是,因为发现刚才那位老兄not null是英文的提示。
gufen 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wildwave 的回复:]
你的那个Ù 有问题,双击了可以看到,但拷出来还是空的
不要这么用
你想查对应的ascii码的话直接用ascii函数
[/Quote]

不查,我是把用户的密码来回倒腾几次形成一个加密的码,sybase上是好的,改成oracle过程倒腾出来是null所以才找什么原因。
小灰狼W 2009-09-11
  • 打赏
  • 举报
回复
估计是字符集的问题
gufen 2009-09-11
  • 打赏
  • 举报
回复

SQL> set serveroutput on
SQL> declare
2 v_var1 varchar2(10) := null;
3 begin
4 v_var1 := v_var1||chr(217);
5 if v_var1 is null then
6 dbms_output.put_line('null');
7 else
8 dbms_output.put_line('not null');
9 dbms_output.put_line(v_var1);
10 end if;
11 end;
12 /
null

PL/SQL 过程已成功完成。

SQL>
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SQL>


奇怪了,我这里是null,不知道是配置问题还是版本问题。
小灰狼W 2009-09-11
  • 打赏
  • 举报
回复
你的那个Ù 有问题,双击了可以看到,但拷出来还是空的
不要这么用
你想查对应的ascii码的话直接用ascii函数
shiyiwan 2009-09-11
  • 打赏
  • 举报
回复
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0
shiyiwan 2009-09-11
  • 打赏
  • 举报
回复
SQL> set serveroutput on
SQL>
SQL> declare
2 v_var1 varchar2(10) := null;
3 begin
4 v_var1 := v_var1||chr(217);
5 if v_var1 is null then
6 dbms_output.put_line('null');
7 else
8 dbms_output.put_line('not null');
9 dbms_output.put_line(v_var1);
10 end if;
11 end;
12 /

not null
?

PL/SQL procedure successfully completed

SQL


我这里执行是not null
gufen 2009-09-11
  • 打赏
  • 举报
回复
楼上的2位不好意思Ù是我查网上的ascii码表copy过来的,如果你在pl/sql dev中执行select chr(217) from dual,看似空的,你在格子里双击就会出现 Ù 符号。

主要我们原来用的sybase数据库,有个加密存储过程,转换到oracle后发现该问题。
小灰狼W 2009-09-11
  • 打赏
  • 举报
回复
select ascii('Ù') from dual
执行结果是43188
小灰狼W 2009-09-11
  • 打赏
  • 举报
回复
试了一下,:=null加上也没有语法问题
问题是chr(217)是空的..
select chr(217) from dual
这个我执行结果是空,你怎么得到Ù 的
小灰狼W 2009-09-11
  • 打赏
  • 举报
回复
v_var1 varchar2(10) := null;
这一句有误
:=null去掉
没有赋初值本身就是空值

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧