我已经在数据库中插入了一些汉字。 (列名是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
答案 0 :(得分:2)
您不能使用中文字符,将它们插入由WE8ISO8859P1字符集绑定的列中,然后再将它们作为中文字符再次选择。您丢失了有关插入的信息。丢失的信息无法重建。
在您的情况下,NAME列(如果它被定义为NVARCHAR2),您可以在后续SELECT
中进行AL16UTF16到AL16UTF16比较。或者,更好的是,如果您的客户端工具完成任务,则根本不需要转换和与AL16UTF16进行比较。
答案 1 :(得分:1)
AS Michael O'Neill已经指出无法在字符集WE8ISO8859P1
中存储中文字符。所有不受支持的字符都会被¿
(或任何其他占位符)自动替换
BTW,WE8ISO8859P1
与WE8MSWIN1252
不同(请参阅What is the exact difference between Windows-1252(1/3/4) and ISO-8859-1?),因此您的转化无论如何都无效。
解决方案是将列NAME
的数据类型更改为NVARCHAR2
或将数据库迁移到UTF-8,请参阅Character Set Migration和Database 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') = '中文版测试';