问题描述
我们计划将所有NVarchar字段转换为Varchar2字段,因为我们将更改字符集,并且由于Oracle建议使用AL32UTF8字符集编码。我的问题是它100% 确定所有字符从Nvarchar (UTF8) 可以转换为Varchar (AL32UTF8) 使用下面。
更新表1
设置Varchar2_field = to_char(Nvarchar2_field);
或者
更新表
设置Varchar2_field = 转换 (NVARCHAR2_field,'al32utf8','utf8');
我们谈论的是需要更新的百万条记录。在我们继续我们的计划之前,我们只想确保一切都将被正确转换。如果它将被转换,我们还想问一下,我们如何才能正确地验证所有数据都已正确转换。谢谢!
更新表1
设置Varchar2_field = to_char(Nvarchar2_field);
或者
更新表
设置Varchar2_field = 转换 (NVARCHAR2_field,'al32utf8','utf8');
我们谈论的是需要更新的百万条记录。在我们继续我们的计划之前,我们只想确保一切都将被正确转换。如果它将被转换,我们还想问一下,我们如何才能正确地验证所有数据都已正确转换。谢谢!
专家解答
通常,您应该可以通过以下方式将UTF8中的NVARCHAR2转换为AL32UTF8中的VARCHAR2:
TO_CHAR将被隐式添加。你可以明确地添加它,当然。然而,做not使用转换。
全部valid应该没有问题地转换UTF8字符值。(这将是位模式转换,因此AL32UTF8和UTF8之间的Unicode版本不匹配无关紧要。)但是,如果您在NVARCHAR2列中有任何非法字节序列,它们将丢失。例如,如果NVARCHAR2列错误地包含二进制数据 (例如来自已弃用的DBMS_OBFUSCATION_TOOLKIT的加密结果),则此数据将在转换中丢失。
要验证现有数据的有效性,您可以尝试使用CSSCAN工具 (https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch12scanner.htm#NLSPG485 ). It is obsolete in 12.1 but still available in 11g. Use parameters FROMNCHAR=UTF8 TONCHAR=AL16UTF16. 全部data should be reported as convertible. No lossy data should be reported.
在数据库> = 12.1和11g中,您也可以在数据库的克隆副本上测试转换。在执行更新之前,请发布以下语句:
如果遇到无效数据,这将导致UPDATE语句失败,并显示 “ORA-12713: NCHAR/CHAR转换中的字符数据丢失”。如果不更改参数,转换将进行,但取决于特定的无效字节序列,替换字符 (U FFFD) 将用于序列或序列将被跳过。更新的错误登录子句 (https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10008.htm#BCEFBFCD) 在识别违规数据时应该很方便,但是您需要仅使用强制性描述/控制列手动创建错误日志表。不要包含原始表列,以避免错误日志代码中的递归ORA-12713。
Update Table1 set Varchar2_field = Nvarchar2_field
TO_CHAR将被隐式添加。你可以明确地添加它,当然。然而,做not使用转换。
全部valid应该没有问题地转换UTF8字符值。(这将是位模式转换,因此AL32UTF8和UTF8之间的Unicode版本不匹配无关紧要。)但是,如果您在NVARCHAR2列中有任何非法字节序列,它们将丢失。例如,如果NVARCHAR2列错误地包含二进制数据 (例如来自已弃用的DBMS_OBFUSCATION_TOOLKIT的加密结果),则此数据将在转换中丢失。
要验证现有数据的有效性,您可以尝试使用CSSCAN工具 (https://docs.oracle.com/cd/E11882_01/server.112/e10729/ch12scanner.htm#NLSPG485 ). It is obsolete in 12.1 but still available in 11g. Use parameters FROMNCHAR=UTF8 TONCHAR=AL16UTF16. 全部data should be reported as convertible. No lossy data should be reported.
在数据库> = 12.1和11g中,您也可以在数据库的克隆副本上测试转换。在执行更新之前,请发布以下语句:
alter session set nls_nchar_conv_excp=true
如果遇到无效数据,这将导致UPDATE语句失败,并显示 “ORA-12713: NCHAR/CHAR转换中的字符数据丢失”。如果不更改参数,转换将进行,但取决于特定的无效字节序列,替换字符 (U FFFD) 将用于序列或序列将被跳过。更新的错误登录子句 (https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10008.htm#BCEFBFCD) 在识别违规数据时应该很方便,但是您需要仅使用强制性描述/控制列手动创建错误日志表。不要包含原始表列,以避免错误日志代码中的递归ORA-12713。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




