【问题标题】:ascii to unicode Database changesascii 到 unicode 数据库更改
【发布时间】:2015-04-28 10:25:38
【问题描述】:

我们正在将遗留应用程序 ascii 迁移到 unicode,作为此活动的一部分,我们需要将数据类型从 varchar2 更改为 nvarchar2,以便它可以接受不同的字符。我正在尝试针对一个表和一列测试此活动(使用更改表脚本),因为表保存数据(13,81,67,254 行)花了 15 分钟以上。存在大约 200 个表(每个表有大约 25 列具有 varchar2 数据类型),要完成此活动将花费大量时间,而且我们不能承受这么多的停机时间。有什么方法可以更快地执行此操作吗? 数据库 - 甲骨文 10 克

编辑问题 - 有什么方法可以避免将数据类型从 varchar2 转换为 nvarchar2?当前以 BYTES 定义的 varchar2 范围,例如- varchar2(3 字节)。

数据库详细信息 -

  • Oracle 10g
  • NLS_CHARACTERSET - UTF8
  • NLS_NCHAR_CHARACTERSET - AL16UTF16

【问题讨论】:

  • 为什么要从 VARCHAR 更改为 NVARCHAR?将您的数据库更改为字符集 AL32UTF8,然后 VARCHAR 工作。现在有了 Unicode,没有理由再使用 NCHAR 或 NVARCHAR。数据类型。
  • @Wernfried - 太好了,我要去看看characterse AL32UTF8。你能解释一下如何去做吗?我的意思是在哪里以及如何设置它。
  • 看看这个文档:Character Set Migration
  • 将在完成文档后回复您
  • @Wernfried - 如果我试图存储 varchar2(3) 列的数据并假设我有“3 个亚洲字符”并且我当前的字符集是“UTF8”不允许我,因为它需要超过 3 个字节。但是,如果我将我的字符集更改为“AL32UTF8”,那么即使它消耗超过 3 个字节,它也会允许我使用吗?您在评论中指的数据库字符集也是 NLS_NCHAR_CHARACTERSET 还是 NLS_CHARACTERSET?

标签: sql oracle


【解决方案1】:

试试

alter table modify <column_name> varchar2(4 char) 

这应该可以在没有任何人注意的实时系统上实现。 4 个字符应该足以存储 Unicode 亚洲字符。

【讨论】:

  • varchar2(4 char) 应该足以存储 四个 Unicode 字符;如果字符集为 AL32UTF8,则最多为 16 个字节。
  • @Ben - 我们的数据库有大约 200 个表(每个表有大约 25 列具有 varchar2 数据类型),因此更改所有这些列的数据类型成为问题,而且它需要永远更改数据类型只是为了一列因为它有很多数据。如果有任何更改数据类型,或者我们可以跳过这部分并在其他地方进行更改以满足我们的要求,那么我正在寻找简单的方法。
  • @PravinSatav - 您是否尝试按照 Ben 的建议运行“alter table modify varchar2(4 char)”。请注意,数据类型保持为 VARCHAR2。我认为如果将数据类型更改为 NVARCHAR2 则需要很长时间,但只需将大小从默认的 varchar2(4) 更改为 varchar2(4 char) 应该很快
【解决方案2】:

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

http://www.oracle.com/technetwork/database/database-technologies/globalization/dmu/overview/index.html

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

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

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

我还建议将默认的 nls_length_semantics 更改为 CHAR。这样 varchar2(n) 将意味着最多可以存储 n 个字符,而不管 n 个字符需要多少字节(只要它小于 4000 个字节)。

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多