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

Database 如何将汉字转换为AL16UTF16或WE8ISO8859P1?,database,oracle,oracle11g,Database,Oracle,Oracle11g,我在数据库中插入了一些汉字。(列名为name,数据类型为VARCHAR2) 我的项目名称是:中文版测试 我需要按此名称选择项目 但是 在oracle数据库中插入中文版测试 名称:ÖÐÎÄ°æÊÔ(如果我理解正确,我的数据库有一个名为WE8ISO8859P1的集合) 我想将这个字符从数据库(ÖÎÄ°æÊÔ)转换为中文字符(中文版测试) 或与相同的值进行比较 我试试这个: select DIRNAME from MILLENNIUM.PROJECTINFO where UPPER(convert(N

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

但是

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

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

我试试这个:

select DIRNAME from MILLENNIUM.PROJECTINFO where UPPER(convert(NAME, 'AL32UTF8', 'we8iso8859p1')) = UPPER(convert('中文版测试', 'WE8MSWIN1252', 'AL32UTF8'));
我需要将oracle的值与项目名称进行比较

Oracle设置: NLS_字符集WE8ISO8859P1 0
NLS\u NCHAR\u字符集AL16UTF16 0

您不能将汉字插入到由WE8ISO8859P1字符集绑定的列中,然后再将其作为汉字选择。您丢失了有关输入的信息无法恢复丢失的信息


在您的例子中,如果名称列被定义为NVARCH2,您可以在随后的
选择
中进行AL16UTF16到AL16UTF16的比较。或者,更好的是,如果您的客户机工具能够完成任务,则根本不需要转换和比较AL16UTF16。

您不能使用中文字符,请将它们插入到由请删除WE8ISO8859P1字符集,然后再次选择它们作为中文字符。插入内容中的信息已丢失。丢失的信息无法重建


在您的例子中,如果名称列被定义为NVARCHAR2,您可以在随后的
选择
中进行AL16UTF16到AL16UTF16的比较。或者,更好的是,如果您的客户端工具能够完成此任务,则根本不需要转换并与AL16UTF16进行比较。

正如Michael O'Neill已经指出的那样,存储中文字符是不可能的字符集中的字符集
WE8ISO8859P1
。所有不支持的字符将自动替换为
(或任何其他占位符)

顺便说一句,
WE8ISO8859P1
不同于
WE8MSWIN1252
(请参阅),因此您的转换无论如何都不起作用

解决方案是将列的数据类型<代码> >名称<代码>改为<代码> nVARCHAR2或将数据库迁移到UTF-8,请参阅。 但是,如果客户端应用程序配置错误,则在某些情况下可能会插入不支持的字符,请参阅

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

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

正如迈克尔·奥尼尔(Michael O'Neill)已经指出的,在字符集
WE8ISO8859P1
中不可能存储汉字。所有不支持的字符都会自动替换为
(或任何其他占位符)

顺便说一句,
WE8ISO8859P1
不同于
WE8MSWIN1252
(请参阅),因此您的转换无论如何都不起作用

解决方案是将列的数据类型<代码> >名称<代码>改为<代码> nVARCHAR2或将数据库迁移到UTF-8,请参阅。 但是,如果客户端应用程序配置错误,则在某些情况下可能会插入不支持的字符,请参阅

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

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

表的定义是什么,特别是名称列的数据类型?@MichaelO'Neill VARCHAR2(1000字节)您的假设是不正确的,即您使用这些字符集设置将中文字符插入数据库的VARCHAR2列。WE8ISO8859P1不允许使用这些字符。您希望一个具有NVARCHAR2列的表具有插入字符,以便以后可以使用您尝试进行比较的方式。t的定义是什么能够,特别是名称列的数据类型?@MichaelO'Neill VARCHAR2(1000字节)您的假设是不正确的,即您使用这些字符集设置将中文字符插入数据库的VARCHAR2列。WE8ISO8859P1不允许使用这些字符。您希望具有NVARCHAR2列的表具有插入内容,您可以稍后使用您尝试进行比较的方式进行操作。但我可以转换我的inserte将值(oracle中某些字符的中文字符)转换为AL16UTF16?您需要将列数据类型定义为
NVARCHAR2(1000)
(而不是
VARCHAR2
),然后您可以插入中文字符。无需转换。我需要以中文字符获取项目名称,而无需将设置更改为oracle。@Vladut很遗憾,您的需要不足以克服规定的限制。对于解决方案,您唯一的选择是调整工具或拒绝您的需要。@WernfriedDomscheit-Good点关于转换的必要性。我更新了答案。但是我可以将插入的值(oracle中的某些字符中的汉字)转换为AL16UTF16?您需要将列数据类型定义为
NVARCHAR2(1000)
(而不是
VARCHAR2
),然后您可以插入中文字符。无需转换。我需要以中文字符获取项目名称,而无需将设置更改为oracle。@Vladut很遗憾,您的需要不足以克服规定的限制。对于解决方案,您唯一的选择是调整工具或拒绝您的需要。@WernfriedDomscheit-Good关于转换必要性的观点。I upda