如何将Oracle数据库中的Unicode转换为中文

shixiaoxiang 2009-04-15 03:41:13
现有Oracle数据库中的一张表,表中某字段的值为几个Unicode,如:\u4e2a\u4eba\u4fe1\u7528
其实就是4个汉字,我希望将他们转换为汉字后输出到文本文件中。如何用PL/SQL实现Unicode到汉字的转换呢?Oracle有没有相关的函数或API?
刚接触PL/SQL,请大家帮忙!

100分奉上!
...全文
1823 33 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tomac 2009-04-27
  • 打赏
  • 举报
回复
先采用下述方法设置客户端字符集,然后,再执行下面的命令.

Unix:
# 常用unicode字符集
export NLS_LANG=american_america.AL32UTF8

Windows:
# 常用中文字符集
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 V_EXT_DES VARCHAR2(30) :='\u4e2a\u4eba\u4fe1\u7528' ;
3 TEXT_BUFFER VARCHAR2(30);
4 V_SQL VARCHAR2(60);
5 BEGIN
6 v_sql := 'select unistr(REPLACE(:v_ext_des,''\u'',''\'')) from dual ';
7 EXECUTE IMMEDIATE v_sql into text_buffer USING V_EXT_DES;
8 DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
9 END;
10 /
个人信用

PL/SQL 过程已成功完成。

SQL> SPOOL OFF
shixiaoxiang 2009-04-27
  • 打赏
  • 举报
回复
再没人解答的话,我准备结贴了~~
shixiaoxiang 2009-04-23
  • 打赏
  • 举报
回复
顶!
shixiaoxiang 2009-04-22
  • 打赏
  • 举报
回复
多谢各位回答
shixiaoxiang 2009-04-21
  • 打赏
  • 举报
回复

SQL> SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHAR%';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8ISO8859P1
Tomac 2009-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shixiaoxiang 的回复:]
感谢楼上的回答
别的语言已经实现了,我现在就是要把别的语言转化为PL/SQL,哈!
[/Quote]

你现在的需求只是一个显示的问题, 可以从ORACLE客户端的设置着手即可.
shixiaoxiang 2009-04-20
  • 打赏
  • 举报
回复
楼上说的有一定道理,但这个数据库是一个大型的商业系统数据库,我不能随便乱动的,泪奔。。。
看来是要放弃了。。。
Tomac 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 shixiaoxiang 的回复:]
楼上说的有一定道理,但这个数据库是一个大型的商业系统数据库,我不能随便乱动的,泪奔。。。
看来是要放弃了。。。
[/Quote]

我是建议你建立一个测试的环境, 而不是更改商业系统. 你还可以试验一下国家字符集.

执行下面的查询,确认一下是否为UTF之类的.

SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE 'NLS_CHAR%';

shixiaoxiang 2009-04-20
  • 打赏
  • 举报
回复
再顶一次!
shixiaoxiang 2009-04-17
  • 打赏
  • 举报
回复
呼唤oracledbalgtu 出现~~~
Tomac 2009-04-17
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 shixiaoxiang 的回复:]
回17楼:文件里也是“????”,而不是汉字

回16楼:数据库里存的就是‘\u4e2a\u4eba\u4fe1\u7528'这种Unicode,我能看到。

这个数据库建得比较早,估计汉字都是这样存进去的。

另,这个数据库建在SUN服务器上,操作系统SunOS5.1,Oracle 10g Enterprise Edition Release 10.2.0.2.0 - 64bit Production
[/Quote]

为什么系统设计的时候存入UNICODE码而不是汉字?估计是数据库的字符集中没有这个汉字,会显示为乱码。
因此,你用正确的方法,在这个环境中是无法呈现汉字的。请构建一个新的字符集为UNICODE的数据库环境,
然后再执行,就可以了。

谢谢!
shixiaoxiang 2009-04-17
  • 打赏
  • 举报
回复
顶一下!。。。
superhsj 2009-04-16
  • 打赏
  • 举报
回复
没有用过execute immediate into
不过最笨的方法就是用游标一条条输出
shixiaoxiang 2009-04-16
  • 打赏
  • 举报
回复
老兄,你已经解决我一半的问题了!
现在就差让“???”显示出汉字了,我们一起努力解决它。

[Quote=引用 10 楼 oracledbalgtu 的回复:]
SQL codeDECLARE
V_EXT_DES VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
V_SQL VARCHAR2(100);
TEXT_BUFFER VARCHAR2(100);
BEGIN
V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
''',''\u'',''\'')) from dual ';
EXECUTE IMMEDIATE V_SQL
INTO TEXT_BUFFER;
DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
END;
/
shixiaoxiang 2009-04-16
  • 打赏
  • 举报
回复
执行结果:
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 V_EXT_DES VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
3 V_SQL VARCHAR2(100);
4 TEXT_BUFFER VARCHAR2(100);
5 BEGIN
6 V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
7 ''',''\u'',''\'')) from dual ';
8 EXECUTE IMMEDIATE V_SQL
9 INTO TEXT_BUFFER;
10 DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
11 END;
12 /

???

PL/SQL procedure successfully completed
怎么显示不了汉字了???

而:
SQL> SELECT unistr(REPLACE('\u4eba\u4fe1\u7528','\u','\')) FROM dual;

UNISTR(REPLACE('\U4EBA\U4FE1\U
------------------------------
人信用

这样可以看到,奇怪啊

[Quote=引用 10 楼 oracledbalgtu 的回复:]
SQL codeDECLARE
V_EXT_DES VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
V_SQL VARCHAR2(100);
TEXT_BUFFER VARCHAR2(100);
BEGIN
V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
''',''\u'',''\'')) from dual ';
EXECUTE IMMEDIATE V_SQL
INTO TEXT_BUFFER;
DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
END;
/
shixiaoxiang 2009-04-16
  • 打赏
  • 举报
回复
这个当然可以执行!
我希望是放到我的PL/SQL块中执行啊

[Quote=引用 11 楼 superhsj 的回复:]
你直接用select unistr(REPLACE(你的字段,''\u'',''\'')) from table
也不能执行吗
[/Quote]
superhsj 2009-04-16
  • 打赏
  • 举报
回复
你直接用select unistr(REPLACE(你的字段,''\u'',''\'')) from table
也不能执行吗
oracledbalgtu 2009-04-16
  • 打赏
  • 举报
回复
DECLARE
V_EXT_DES VARCHAR2(1000) := '\u4eba\u4fe1\u7528';
V_SQL VARCHAR2(100);
TEXT_BUFFER VARCHAR2(100);
BEGIN
V_SQL := 'select unistr(REPLACE(''' || V_EXT_DES ||
''',''\u'',''\'')) from dual ';
EXECUTE IMMEDIATE V_SQL
INTO TEXT_BUFFER;
DBMS_OUTPUT.PUT_LINE(TEXT_BUFFER);
END;
/


[Quote=引用 9 楼 shixiaoxiang 的回复:]
v_ext_des是Unicode字符串
语句:
v_sql := 'select unistr(REPLACE(v_ext_des,''\u'',''\'')) from dual ';
EXECUTE IMMEDIATE v_sql into text_buffer;

报错:ORA-00904: "V_EXT_DES": invalid identifier

似乎v_ext_des这个变量的值传不进去sql语句里,所以报错。
而v_sql := 'select unistr(REPLACE('||v_ext_des||',''\u'',''\'')) from dual ';
将v_sql语句拆成了3部分,EXECUTE IMMEDIATE就执行不了了。…
[/Quote]
shixiaoxiang 2009-04-16
  • 打赏
  • 举报
回复
v_ext_des是Unicode字符串
语句:
v_sql := 'select unistr(REPLACE(v_ext_des,''\u'',''\'')) from dual ';
EXECUTE IMMEDIATE v_sql into text_buffer;

报错:ORA-00904: "V_EXT_DES": invalid identifier

似乎v_ext_des这个变量的值传不进去sql语句里,所以报错。
而v_sql := 'select unistr(REPLACE('||v_ext_des||',''\u'',''\'')) from dual ';
将v_sql语句拆成了3部分,EXECUTE IMMEDIATE就执行不了了。
难道就没办法么?
shixiaoxiang 2009-04-16
  • 打赏
  • 举报
回复
感谢楼上高人的回答,编译没问题,但运行起来还是报错:
ORA-00911: invalid character

是怎么回事呢?

[Quote=引用 7 楼 oracledbalgtu 的回复:]
SQL codev_sql := 'select unistr(REPLACE('||v_ext_des||',''\u'',''\'')) from dual ';
EXECUTE IMMEDIATE v_sql into text_buffer;
加载更多回复(13)

17,140

社区成员

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

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