Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ascii到unicode数据库的更改_Sql_Oracle - Fatal编程技术网

Sql ascii到unicode数据库的更改

Sql ascii到unicode数据库的更改,sql,oracle,Sql,Oracle,我们正在将传统应用程序ascii迁移到unicode,作为此活动的一部分,我们需要将数据类型从varchar2更改为nvarchar2,以便它可以接受不同的字符。我尝试为一个表和一个列测试这个活动(使用ALTERTABLE脚本),由于表中保存了数据(13,81,67254行),所以花费了超过15分钟的时间。目前大约有200个表(每个表大约有25列具有varchar2数据类型),要完成此活动需要花费大量时间,我们无法承受如此多的停机时间。有什么方法可以更快地执行此操作吗? 数据库-甲骨文10g 编

我们正在将传统应用程序ascii迁移到unicode,作为此活动的一部分,我们需要将数据类型从varchar2更改为nvarchar2,以便它可以接受不同的字符。我尝试为一个表和一个列测试这个活动(使用ALTERTABLE脚本),由于表中保存了数据(13,81,67254行),所以花费了超过15分钟的时间。目前大约有200个表(每个表大约有25列具有varchar2数据类型),要完成此活动需要花费大量时间,我们无法承受如此多的停机时间。有什么方法可以更快地执行此操作吗? 数据库-甲骨文10g

编辑问题-是否有任何方法可以避免将数据类型从varchar2转换为nvarchar2?当前仅varchar2范围以字节定义,例如-varchar2(3字节)

数据库详细信息-

  • 甲骨文10g
  • NLS_字符集-UTF8
  • NLS\u NCHAR\u字符集-AL16UTF16
试试看

alter table modify <column_name> varchar2(4 char) 
alter table modify varchar2(4个字符)
这应该可以在没有任何人注意的情况下在实时系统上实现。
4个字符应该足以存储Unicode亚洲字符。

我建议使用最新的Oracle Data Migration Assistant for Unicode(DMU)。以下是一个链接:

但是了解Unicode也很好(这并不复杂)。为了更好地理解Unicode,请查看Wiki

我同意那些评论说使用默认的基于unicode的字符集最有意义,这样您就可以使用varchar,而不需要nvarchar

转换的一个问题是大小。假设您有一个varchar2(3)的声明。此声明意味着您最多可以存储3个字节,对于非unicode,这些字节等于3个字符,因为每个字符只占用一个字节。但在unicode中,一个字符可以占用一个以上的字节。您可以将声明更改为varchar2(3个字符),然后它将适用于unicode。您还可以将varchar2数据库的默认值更改为CHAR,而不是BYTE。在这两种情况下,您仍然需要处理最大字节问题。varchar2的最大字节数为4000(除非您升级到Oracle 12c,在这种情况下,您可以将最大字节数更改为32767字节)。在任何情况下,如果您有一个varchar2(4000字符)的声明,那么您可能无法插入4000个unicode字符。如果在unicode编码中所有字符都用一个字节表示(例如,如果它们是ascii字符),则只能插入这么多字符。在AL32UTF中,所有字符占用1-4字节。这意味着如果使用varchar2(1000个字符)声明,即使所有字符都有4字节编码,也可以保证最多有1000个字符


我还建议将默认的nls_length_语义更改为CHAR。这样,varchar2(n)将意味着最多可以存储n个字符,而不考虑n个字符所需的字节数(只要少于4000字节)。

为什么要从VARCHAR更改为NVARCHAR?将数据库更改为characterset AL32UTF8,然后VARCHAR工作。如今,有了Unicode,就没有理由再使用NCHAR或NVARCHAR了。数据类型。@Wernfried-那太好了,我要关注角色AL32UTF8。你能告诉我怎么做吗?我的意思是在哪里以及如何设置。看一下这个文档:我们将在通过document@Wernfried-我浏览了文档,但有一个疑问,如果我试图存储varchar2(3)列的数据,假设我有“3个亚洲字符”,并且我当前的字符集是“UTF8”这是不允许我,因为它需要超过3个字节。但是,如果我将我的字符集更改为“AL32UTF8”,那么即使它消耗超过3个字节,它也会允许我吗?另外,您在评论中所指的DB characterset是NLS\u NCHAR\u characterset或NLS\u characterset?
varchar2(4个字符)
应足以存储四个Unicode字符;如果字符集为AL32UTF8,则最多为16字节。@Ben-我们的数据库中大约有200个表(每个表大约有25列具有varchar2数据类型),因此更改所有这些列的数据类型成为一个问题,而且由于数据量很大,只更改一列的数据类型也会花费很长时间。我正在寻找一种简单的方法,如果有任何更改数据类型的方法,或者如果我们可以跳过这一部分并在其他地方进行更改以满足我们的要求,那么这将非常好。@Pravinstav-您是否尝试按照Ben的建议运行“alter table modify varchar2(4 char)”。注意,数据类型保持为VARCHAR2。我认为如果您将数据类型更改为NVARCHAR2,那么将需要很长时间,但是简单地将大小从默认的varchar2(4)更改为varchar2(4)应该非常快