首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将汉字转换为AL16UTF16或WE8ISO8859P1?

如何将汉字转换为AL16UTF16或WE8ISO8859P1?
EN

Stack Overflow用户
提问于 2018-02-21 13:46:58
回答 2查看 2.5K关注 0票数 0

我在数据库中插入了一些汉字。(列名是名称,数据类型是VARCHAR2)我的项目名是:中文版测试,我需要按这个名称选择项目。

但。

在oracle数据库中插入了名为中文版测试的中文版测试(如果我理解正确的话,我的数据库有一个名为中文版测试的集合)

我想要将这个字符从数据库( or )转换为中文字符(中文版测试),或者转换成一个相同的值来进行比较。

我试试看:

代码语言:javascript
运行
复制
select DIRNAME from MILLENNIUM.PROJECTINFO where UPPER(convert(NAME, 'AL32UTF8', 'we8iso8859p1')) = UPPER(convert('中文版测试', 'WE8MSWIN1252', 'AL32UTF8'));

我需要将oracle的值与项目的名称进行比较。

Oracle设置: NLS_CHARACTERSET WE8ISO8859P1 0 NLS_NCHAR_CHARACTERSET AL16UTF16 0

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-22 10:04:27

正如迈克尔·奥尼尔( Michael‘’Neill)已经指出的那样,不可能在字符集WE8ISO8859P1中存储汉字。所有不受支持的字符将自动由¿ (或任何其他位置保持器)替换。

顺便说一句,WE8ISO8859P1不同于WE8MSWIN1252 (参见Windows1252(1/3/4)和ISO-8859-1的确切区别是什么?),所以您的转换无论如何都不起作用。

解决方案是将列NAME的数据类型更改为NVARCHAR2,或者将数据库迁移到UTF-8,参见字符集迁移Unicode指南数据库迁移助理。在任何情况下,您都应该考虑您的数据丢失,resp。损坏了。

但是,如果您的客户端应用程序配置了错误的,那么在某些情况下可以插入不受支持的字符,请参阅如果我们有US7ASCII字符集,为什么它允许我们存储非ascii字符?

在这种情况下,您可以尝试按以下方式修复数据:

代码语言:javascript
运行
复制
ALTER TABLE PROJECTINFO ADD NAME_CN NVARCHAR2(100);
UPDATE PROJECTINFO SET NAME_CN = UTL_I18N.RAW_TO_NCHAR(UTL_I18N.STRING_TO_RAW(NAME), 'ZHS16CGB231280');
ALTER TABLE PROJECTINFO DROP COLUMN NAME;
ALTER TABLE PROJECTINFO RENAME COLUMN NAME_CN TO NAME;

select DIRNAME from MILLENNIUM.PROJECTINFO where NAME = '中文版测试';

但它可能不适用于你所有的数据。

因此,(不建议)解决您的问题的方法可能是

代码语言:javascript
运行
复制
select DIRNAME 
from MILLENNIUM.PROJECTINFO 
where UTL_I18N.RAW_TO_NCHAR(UTL_I18N.STRING_TO_RAW(NAME), 'ZHS16CGB231280') = '中文版测试';
票数 2
EN

Stack Overflow用户

发布于 2018-02-21 14:19:41

您不能接受汉字,将它们插入到由WE8ISO8859P1字符集绑定的列中,然后再次选择它们作为中文字符。插入的信息丢失了。丢失的信息不能重建。

在您的示例中,如果将NAME列定义为NVARCHAR2,则可以在后续的SELECT中进行AL16UTF16到AL16UTF16的比较。或者,更好的是,如果客户端工具能够完成任务,则根本不需要转换和与AL16UTF16进行比较。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48907567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档