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

时间:2018-02-21 13:46:59

标签: database oracle oracle11g

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

但是

在oracle数据库中插入中文版测试,名称为:ÖÐÎÄ°æ²ÊÊ(如果我理解的话,我的数据库中有一个名为WE8ISO8859P1的集合)

我想将这些字符从数据库(ÖÐÎÄ°æ²ÊÊ)转换为中文字符(中文版测试)或相同的值进行比较。

我试试这个:

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

2 个答案:

答案 0 :(得分:2)

您不能使用中文字符,将它们插入由WE8ISO8859P1字符集绑定的列中,然后再将它们作为中文字符再次选择。您丢失了有关插入的信息。丢失的信息无法重建。

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

答案 1 :(得分:1)

AS Michael O'Neill已经指出无法在字符集WE8ISO8859P1中存储中文字符。所有不受支持的字符都会被¿(或任何其他占位符)自动替换

BTW,WE8ISO8859P1WE8MSWIN1252不同(请参阅What is the exact difference between Windows-1252(1/3/4) and ISO-8859-1?),因此您的转化无论如何都无效。

解决方案是将列NAME的数据类型更改为NVARCHAR2或将数据库迁移到UTF-8,请参阅Character Set MigrationDatabase Migration Assistant for Unicode Guide。在任何情况下,您都应该考虑丢失数据。损坏。

,如果您的客户端应用程序错误地配置,那么在某些情况下可以插入不受支持的字符,请参阅If we have US7ASCII characterset why does it let us store non-ascii characters?

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

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 = '中文版测试';

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

因此,针对您的问题的(不推荐)解决方法可能是

select DIRNAME 
from MILLENNIUM.PROJECTINFO 
where UTL_I18N.RAW_TO_NCHAR(UTL_I18N.STRING_TO_RAW(NAME), 'ZHS16CGB231280') = '中文版测试';