我想将一个oracle数据库从非unicode服务器(EL8ISO8859P7字符集和AL16UTF16 NCHAR字符集)移动到unicode服务器。特别是具有AL32UTF8字符集的Oracle Express服务器。
简单地导出(exp)和导入(imp)数据失败。我们有很多varchar2列,其长度以字节为单位指定。当它们的内容以unicode映射时,它们会占用更多的字节并被截断。
我尝试了以下内容:
- 使用脚本将原始数据库的所有varchar2列的长度加倍(varchar2(10)变为varchar2(20))
- 出口
- 导入到新服务器
它有效。显然加倍是任意的,我可能应该用CHAR语义将它们改为相同的大小。
我也尝试了以下内容:
- 将所有varchar2列更改为nvarchar2(相同大小 - varchar(10)变为nvarchar(10))
- 出口
- 导入到新服务器
它也有效。
不知何故后者(转换为nvarchar)似乎更清洁"。然后你再次拥有一个带有unicode数据类型的unicode数据库,这看起来很奇怪。
所以问题是:有没有建议的方法来在两台服务器之间移动数据库?我上面提到的两种方法中的任何一种都有严重的问题吗?
答案 0 :(得分:3)
不要使用NVARCHAR2
数据类型,除非这是您唯一的选择。国家字符集用于处理您具有不支持Unicode的现有遗留应用程序并且您希望在系统中添加少量列而不触及这些遗留应用程序的情况。使用NVARCHAR2
列非常适合这些情况,但它会在应用程序开发中产生各种问题。大量工具,API和应用程序要么不支持NVARCHAR2
列,要么需要其他配置才能执行此操作。由于NVARCHAR2
列在Oracle世界中相对不常见,因此很容易花费大量时间来尝试解决遇到的特定问题。不太重要的是,由于AL16UTF16
每个字符至少需要2个字节,因此您的大部分数据可能都包含英文字符,因此您可能需要更多空间。
我非常希望使用字符长度语义迁移到新数据库(即VARCHAR2(10 BYTE)
变为VARCHAR2(10 CHAR)
)。这避免了允许的长度加倍。它还可以更容易地向用户解释长度限制是什么(或在前端编码那些验证)。对于大多数用户来说,解释某个特定列有时可以容纳20个字符(当只使用英文字符时),有时会容纳10个字符(当只使用非英文字符时),并且有时可以保留,这非常令人困惑中间的东西(当有混合的字符时)。字符长度语义使所有这些问题变得更加容易。
答案 1 :(得分:1)
迁移到unicode数据库是一个4步骤的过程。
跳过步骤2和3会再次使用字节长度定义字段,并且在导入过程中可能会出现大量错误,因为数据不适合定义的列。如果源数据库中只有我们字符,那么它不会成为一个大问题,但是例如拉丁字符会产生问题,因为单个字符可能需要更多的字节。
按照列出的程序防止长度问题。显然有更多的方法可以做到这一点,但规则是先让ddl定义好,然后再插入数据。