3

SQLサーバーからオラクルに移行しようとして奇妙な問題に直面しています。私のテーブルの1つに、NVARCHAR(255) オラクルがバイトをカウントするときにSQLサーバーが文字をカウントしていることを少し読んだ後、によって定義された列があります。そこで、オラクルでテーブルをVARCHAR(510)255*2 = 510 と定義しましたが、sqlldr を使用してタブ区切りのテキスト ファイルからデータをロードすると、一部のエントリがこの列の長さを超えていることを示すエラーが発生します。次を使用してSQLサーバーにチェックインした後:

SELECT MAX(DATALENGTH(column))
FROM table

最大データ長は 510 です。

私は Hebrew_CI_AS collat​​iong を使用していますが、何も変更されていないと思います.... SQL Server で、エントリのいずれかに TAB が含まれているかどうかもチェックインしましたが、含まれていない...だから、破損したデータではないと思います....アイデア?

EDIT さらに調べたところ、問題はデータファイルが原因であることに気付きました(@Justin Caveの投稿で解決された問題に加えて.

私のデータにはこの文字と「|^|」が含まれていないため、行区切りを「^」に変更しました。列区切りとして。

次のように制御ファイルを作成します。

load data
infile data.txt "str '^'"
badfile "data_BAD.txt"
discardfile "data_DSC.txt"
into table table
FIELDS TERMINATED BY '|^|' TRAILING NULLCOLS
(
     col1,
     col2,
     col3,
     col4,
     col5,
     col6
)

問題は、私のデータが含まれて<CR>おり、そこにストリームファイルを期待しているsqlldrが<CR>!!!!で失敗することです。テキストデータであるため、データを変更したくありません(例のエラーメッセージ)。

4

2 に答える 2

5

データベースの文字セットは何ですか

SELECT parameter, value
  FROM v$nls_parameters
 WHERE parameter LIKE '%CHARACTERSET'

データベースの文字セットがAL32UTF8であるとすると、各文字には最大4バイトのストレージが必要になる可能性があります(ただし、ほとんどすべての有用な文字は最大3バイトのストレージで表すことができます)。VARCHAR2(1020)したがって、十分なスペースがあることを確認するために列を宣言できます。

単に文字長のセマンティクスを使用することもできます。列を宣言するVARCHAR2(255 CHAR)と、必要なスペースの量に関係なく、255文字のスペースが割り当てられます。NLS_LENGTH_SEMANTICS初期化パラメータをデフォルトのBYTEからCHARに変更すると、デフォルトが変更され、ではなくVARCHAR2(255)として解釈されます。文字長セマンティクスを使用している場合でも、残りの4000バイトの制限に注意してください。VARCHAR2(255 CHAR)VARCHAR2(255 BYTE)VARCHAR2

データに改行が含まれている場合、TRAILING NULLCOLSパラメーターは必要ですか?これは、論理行の末尾から列が省略される場合があることを意味します。省略される可能性のある列と、改行を含む列、および少なくともオプションの囲み文字で囲まれていないデータを組み合わせる場合、論理行がどこで終了し、どこで開始したかをどのように識別し始めるかはわかりません。実際にパラメーターが必要ない場合は、 CONTINUEIFパラメーターを使用して、複数の物理行を1つの論理行に結合TRAILING NULLCOLSできるはずです。データファイル形式を変更できる場合は、オプションのエンクロージャ文字を追加することを強くお勧めします。

于 2011-10-31T14:27:11.840 に答える
-1

フィールドで使用されるバイトNVARCHARは、文字数の2倍に2を加えたものに等しいため(http://msdn.microsoft.com/en-us/library/ms186939.aspxを参照)、VARCHARフィールドを512にすると、次のようになります。わかった。一部の文字セットが1文字あたり4バイトを使用しているという兆候もありますが、ヘブライ語がこれらの文字セットの1つであるという兆候は見つかりませんでした。

于 2011-10-31T14:24:51.670 に答える