有问题么?我试下来没有问题。
服务器和客户端都是英文。
ASC字符串==>16进制串
create or replace function AscToHex(sIn IN varchar2)
RETURN varchar2
IS
sTmp varchar2(4000);
i integer;
BEGIN
i:=1;
stmp:='';
for i in 1..length(sIn) loop
sTmp:=sTmp||trim(to_char(ascii(substr(sIn,i,1)),'XXXX'));
end loop;
return sTmp;
END;
/16进制串==>ASC字符串
create or replace function HexToAsc(sIn IN varchar2)
RETURN varchar2
IS
sTmp varchar2(4000);
i integer;
BEGIN
i:=1;
stmp:='';
loop
exit when i>length(sIn);
sTmp:=sTmp||chr(to_number(substr(sIn,i,2),'XXXX'));
i:=i+2;
end loop;
return sTmp;
END;
/SQL>select hextoasc(asctohex('你好ABC么')) from dual;
HEXTOASC(ASCTOHEX('拿好ABC么'))
--------------------------------------------------------------------------------
你好ABC么
服务器和客户端都是英文。
ASC字符串==>16进制串
create or replace function AscToHex(sIn IN varchar2)
RETURN varchar2
IS
sTmp varchar2(4000);
i integer;
BEGIN
i:=1;
stmp:='';
for i in 1..length(sIn) loop
sTmp:=sTmp||trim(to_char(ascii(substr(sIn,i,1)),'XXXX'));
end loop;
return sTmp;
END;
/16进制串==>ASC字符串
create or replace function HexToAsc(sIn IN varchar2)
RETURN varchar2
IS
sTmp varchar2(4000);
i integer;
BEGIN
i:=1;
stmp:='';
loop
exit when i>length(sIn);
sTmp:=sTmp||chr(to_number(substr(sIn,i,2),'XXXX'));
i:=i+2;
end loop;
return sTmp;
END;
/SQL>select hextoasc(asctohex('你好ABC么')) from dual;
HEXTOASC(ASCTOHEX('拿好ABC么'))
--------------------------------------------------------------------------------
你好ABC么
解决方案 »
- 如何将csv格式的文件转换为dbf格式?
- 历史数据的处理让人头疼
- 你知道的进来看看
- 英語水平不好,請大家 help!!!急急
- 安装oracle时碰到的问题.在线等...
- 求UNIX下安装ORACLE的方法,急!!!
- 急!oracleservice启动不了!
- 在window下如何看错误号的解释,就象unix下的oerr一样??
- 我的9i数据库的sys包都显示打x,不能用了,在创建用户的时候都说包能用,艾,有什么办法恢复的
- ORA-03113: 通信通道的文件结束
- 基本问题:如何在sql*plus or sqlplus worksheet中运行调试存储过程?
- 这个SQL语句怎么写?????在线等待。。。。
你是在中文字符集的数据库下吗?
中文下,好像是由问题,问题在于字符的长度计算不同,在英文字符集下,
SQL>select length('你') from dual;
结果是2
SQL>select length('你') from dual;
结果是1所以,你应该这样写
SQL> select chr(210*16*16+166) from dual;CHR(
----
姚
create or replace function HexToAsc(sIn IN varchar2)
RETURN varchar2
IS
sTmp varchar2(4000);
i integer;
x integer;
BEGIN
i:=1;
stmp:='';
loop
exit when i>length(sIn);
x:=to_number(substr(sIn,i,2),'XXXX');
if x>128 then
sTmp:=sTmp||chr(to_number(substr(sIn,i,4),'XXXX'));
i:=i+4;
else
sTmp:=sTmp||chr(to_number(substr(sIn,i,2),'XXXX'));
i:=i+2;
end if;
end loop;
return sTmp;
END;
/
英文下
select ascii(substr('要',1,1)) from dual
--返回210中文下
select ascii(substrb('要',1,1)) from dual
--返回32
--字符串到十六进制转换
CREATE OR REPLACE function strtohex(str varchar2)
return varchar2
is
i number;
j number;
s char;
n number;
rst varchar2(2000);
begin
i := 1;
j := 0;
n := 0;
rst := '';
Loop
s := substr(str, i, 1);
if ((s between chr(32) and chr(127)) and s<>'=')
or (s=chr(13))
or (s=chr(10))
then
rst := rst || s;
j := j+1;
else begin
if (mod(n, 2)=0) and (s<>'=') then
rst := rst ||'='|| to_hex(ascii(s));
n:= 0;
else
rst := rst || to_hex(ascii(s));
if s='=' then n:=n-1; end if;
end if;
n := n + 1;
j := j + 3;
end;
end if;
if (s=chr(13)) or (s=chr(10)) then
j := 0;
end if;
if j >= 70 then
rst := rst || chr(13)||chr(10);
j := 0;
end if;
exit when i=lengthb(str);
i := i + 1;
end loop;
return rst;
end;
/函数功能:在中文字符集下,把字符串转换为十六进制的串SQL> select strtohex('asffd你ksjdhf好akjdfhlf!') from dual;STRTOHEX('ASFFD拿KSJDHF好AKJDFHLF!')
-------------------------------------------------
asffd=C4E3ksjdhf=BAC3akjdfhlf!十六进制转换为字符
SQL>select hextostr('asffd=C4E3ksjdhf=BAC3akjdfhlf!') from dual
HEXTOSTR('ASFFD=C4E3KSJDHF=BAC3AKJDFHLF!')
-------------------------------------------------
asffd你ksjdhf好akjdfhlf!但如果在strtohex函数中含有等于号(=),则返回结果不正确:
SQL> select strtohex('=你好!') from dual;STRTOHEX('=拿好!')
-----------------------------------------------------
3D=C4E3=BAC3!转换为字符:
SQL>select hextostr('3D=C4E3=BAC3!') from dualHEXTOSTR('3D=C4E3=BAC3!')
---------------------------------------------
3D你好!等号变成3D,因为我是用等号来分割十六进制的以上这个函数要如何改进??
如果你想实现,用=号来分割16进制,你需要自己再外面再套一层函数。这个函数功能就是解决以=号为分割符,split你的串,并且转换出来,再拼接起来。good luck
“字母和汉字混合,比较难解析”,为什么呢?我认为一点都不难。对于varchar来说,汉字是由两个字节组成,而英文是由一个字节组成。汉字的两个字节的数值都是>127。所以,我认为一点都不难,没有必要用=来分割。
呵呵,如果你要分割的话,你本身已经可以做到正确区分汉字的英文字符了,难道不是么?
你同时可以参考一下,我解答的另外一个去掉半个汉字的问题。
http://expert.csdn.net/Expert/topic/1901/1901102.xml?temp=.999386
前面这些问题已经搞定了,但又提出个新问题:oracle客户端是英文字符集,数据库服务器是中文字符集,
应用程序运行在英文字符集的客户端,如何正常查询并显示数据库服务器的信息?根据转换方式可能就不行了吧?
windows下,注册表hkey_local_machine\software\oracle\home0\
把nls_lang设成SIMPLIFIED CHINESE_CHINA.ZHS16GBK就可以了。