我们正在将一些数据从sql server迁移到oracle.对于在SQL server中定义为NVARCHAR的列,我们开始在Oracle中创建NVARCHAR列,以为它们是相似的.但看起来并不是这样.

我已经读了几篇关于Stackoverflow的帖子,想确认一下我的发现.

如果数据库字符集是AL32UTF8(对于我们的例子是这样),Oracle VARCHAR2已经支持Unicode.

SQLServerVARCHARdoes not支持unicode.SQLServer明确要求列为NCHAR/NVARCHAR类型,以unicode(特别是2字节UCS-2格式)存储数据..

因此,说SQL Server NVARCHAR列可以/应该迁移为Oracle VARCHAR2列是正确的吗?

推荐答案

是的,如果您的Oracle数据库是使用Unicode字符集创建的,则SQL Server中的NVARCHAR应迁移到Oracle中的VARCHAR2.在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;

这使您可以避免每次定义新列时都键入CHAR.也可以在系统级别进行设置,但NLS团队不鼓励这样做--显然,并不是Oracle提供的所有脚本都针对NLS_LENGTH_SEMANTICS已更改的数据库进行了彻底测试.而且可能很少有第三方脚本是这样的.

Database相关问答推荐

MongoDB 中的 OVER PARTITION 类似功能

将数据集上传到 Hub 时停止运行时会导致什么?

PostgreSQL 嵌套 INSERTs / WITHs 用于外键插入

管理数据库中的产品计数

从 DbDataReader 读取数据的最快方法是什么?

存储所有排列的模式数据库

Java 数据库连接池(BoneCP vs DBPool vs c3p0)

数据库中空值(nulls)使用的空间

如何验证 SQLAlchemy ORM 中的列数据类型?

我应该为我创建的新创建的 PostgreSQL 模式使用什么正确的文件扩展名?

对百万行表,MySQL 的 LIKE 查询的性能怎样?

在 iphone 上本地存储数据

存储并仍然索引加密客户数据的最佳方式是什么?

面向文档的数据库是否旨在取代关系数据库?

在 SQL Server 2008 中区分两个表架构的最简单方法是什么?

Redis-cli - Select 哪个实例?

我如何做大于/小于使用 MongoDB?

Web 应用程序的文件存储:文件系统、数据库和 NoSQL 引擎

如何安装/更新到 Postgres 9.4?

SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects