Zen*_*nil 18 database sql-server oracle nvarchar varchar2
我们正在将一些数据从sql server迁移到oracle.对于NVARCHAR在SQL Server中定义的NVARCHAR列,我们开始在Oracle中创建列,认为它们类似.但看起来它们不是.
我已经在stackoverflow上阅读了几篇帖子,并希望确认我的发现.
如果数据库字符集是AL32UTF8(在我们的情况下也是如此),Oracle VARCHAR2已经支持unicode.
SQLServer VARCHAR 不支持unicode.SQLServer明确要求列在NCHAR/NVARCHAR类型中以unicode(特别是2字节UCS-2格式)存储数据.
因此,可以/应该将SQL Server NVARCHAR列迁移为Oracle VARCHAR2列是否正确?
Jus*_*ave 29
是的,如果您的Oracle数据库是使用Unicode字符集创建的,NVARCHAR则应在SQL Server中将其迁移到VARCHAR2Oracle中.在Oracle中,NVARCHAR存在数据类型,以允许应用程序在数据库字符集不支持Unicode时使用Unicode字符集存储数据.
但是,迁移中要注意的一件事是字符长度语义.在SQL Server中,NVARCHAR(20)为20个字符分配空间,在UCS-2中最多需要40个字节.在Oracle中,默认情况下,VARCHAR2(20)分配20个字节的存储空间.在AL32UTF8字符集,也就是可能只有足够的空间,6个字符,但最有可能将处理更多(单个字符AL32UTF8需要1至3个字节,你可能想声明您的Oracle类型,VARCHAR2(20 CHAR)这表明要分配无论需要多少字节,都可以容纳20个字符的空间.这比尝试解释为什么允许使用大约20个字符串而拒绝其他10个字符串更容易进行通信.
您可以在会话级别更改默认长度语义,以便您创建的任何表而不指定任何长度语义将使用字符而不是字节语义
ALTER SESSION SET nls_length_semantics=CHAR;
Run Code Online (Sandbox Code Playgroud)
这样可以避免CHAR每次定义新列时都键入内容.也可以在系统级别设置它,但NLS团队不鼓励这样做 - 显然,并非Oracle提供的所有脚本都已针对NLS_LENGTH_SEMANTICS已更改的数据库进行了全面测试.可能很少有第三方脚本.
| 归档时间: |
|
| 查看次数: |
44200 次 |
| 最近记录: |