2013-08-20 23 views
13

いくつかのデータをSQLサーバーからOracleに移行しています。 SQLサーバーのNVARCHARとして定義された列の場合、我々は類似していると考えているOracleではNVARCHAR列を作成し始めました。しかし、そうではないように見えます。OracleとSQL ServerのNVARCHARの違いは?

私はstackoverflowでいくつかの記事を読んで、私の発見を確認したいと思います。

Oracle VARCHAR2は、データベースのキャラクタ・セットがAL32UTF8(これは当てはまる)の場合、すでにunicodeをサポートしています。

SQLServer VARCHARはユニコードをサポートしていません。 SQLServerは明示的に列をNCHAR/NVARCHAR型にする必要があります(具体的には2バイトのUCS-2形式)。

したがって、SQL ServerのNVARCHAR列をOracleとして移行することができますVARCHAR2列?

+0

MicrosoftがOracle NVARCHAR2を確認しました<==> SQLServer NVARCHAR ...しかし、私が確認したかったのはOracle VARCHAR2でした<==> SQLServer NVARCHAR? (oracle VARCHAR2はUnicodeの準備ができています) – Zenil

答えて

22

はい、OracleデータベースがUnicode文字セットを使用して作成されている場合、SQL ServerのNVARCHARはOracleのVARCHAR2に移行する必要があります。 Oracleでは、データベース・キャラクタ・セットがUnicodeをサポートしていない場合に、アプリケーションがUnicode文字セットを使用してデータを格納できるように、データ型はNVARCHARです。

ただし、移行時に注意する必要があるのは、文字長のセマンティクスです。 SQL Serverでは、NVARCHAR(20)はUCS-2で最大40バイトを必要とする20文字のスペースを割り当てます。 Oracleでは、デフォルトでVARCHAR2(20)が20バイトのストレージを割り当てます。 AL32UTF8の文字セットでは、それは潜在的に6文字のための十分なスペースですが、ほとんどの場合、それ以上の処理が行われます(AL32UTF8では1文字に1〜3バイトが必要です)。必要なバイト数に関係なく20文字分のスペースを確保したいのですが、20文字以内の文字列が許されているのに対し、他の10文字は拒否されている理由を説明するよりもはるかに通信しやすい傾向があります。

長さセマンティクスを指定せずに作成したテーブルがバイトセマンティクスではなく文字を使用するように、セッションレベルでのデフォルトの長さセマンティクス

ALTER SESSION SET nls_length_semantics=CHAR; 

これにより、新しい列を定義するたびにCHARと入力することを避けることができます。システムレベルでそれを設定することも可能ですが、NLSチームは推奨しません.Oracleが提供するすべてのスクリプトがNLS_LENGTH_SEMANTICSが変更されたデータベースに対して完全にテストされたわけではありません。おそらくごく少数のサードパーティスクリプトがあります。

+0

大きな回答...私はいくつかの質問がありました。私たちが実際にデータの切り詰めの問題に関心を持っている場合、すべてのOracle列をVARCHAR2として作成するものとします。 SQL Server VARCHAR列のデータは正しく移行されます。 SQL ServerのNVARCHARクーミングからのデータはどうですか? SQL Server NVARCHARはUTF-16でデータを格納し、Oracle VARCHAR2はUTF-8です。移行ツールはどうにかしてこれを処理する必要がありますか?主な答えにあなたの考えを加えてください。 – Zenil

+1

@Zenil - 私はすでに私の答えでこれをカバーしていると信じています。 Oracleで列を定義するときに文字長のセマンティクスを使用すると、Oracleの 'varchar2(20 char)'とSQL Serverの 'nvarchar(20)'にはそれぞれ20文字のスペースがあります。それぞれに20文字分のスペースがある場合、切り捨ての問題について心配する必要はありません。 –

+0

私は切り捨ての問題に取り組んだが、エンコーディングの問題には取り組んでいないと思う。 SQL ServerのNVARCHAR列はUTF-16でエンコードされますが、oracle VARCHAR2列はUTF-8でエンコードされます。このため、移行ツールはこの事実を認識し、適切な変換を行う必要があります。私たちがその段階に到達したら、これを見つけなければなりません。 – Zenil

関連する問題