サイドバーの壁紙
博主头像
tin博主等级

子の曰わく、我れ三人行なえば必ず我が師を得(う)。其の善き者を択びてこれに従う。其の善からざる者にしてこれを改む。

  • 累積執筆 72 記事
  • 累計作成 32 タグ
  • 累計受入 2 コメント

目 次CONTENT

記事目次

A5でインポートする際のエラー:ORA-12899、列の値が大きすぎます

tin
tin
2023-07-04 / 0 コメント / 2 いいね! / 706 読み / 699 文字

A5でインポートする際に、下記のようなエラーが発生しました。

<エラーメッセージ:>
ORA-12899 列”schemaA”.“tableA”."columnA"の値が大きすぎます(実際:31、最大:21)

補足:インポートしようとするデータはA5でエクスポートしたもので、実行不能は不思議ですね!

問題のcolumnAについて、

定義     char(21)
実データ   あいうえお+[16個半角スペース]  
       ⇒utf8なので、5文字*3バイト+16スペース=31バイト
ヒント:上記の定義のchar(21)は21文字ではなく、21バイトとしてA5に認識されてしまうと疑います。

解説(20240731 追記)
よくある誤解は、char(n) と varchar(n) では、n によって文字数が定義されると考えられていることです。 ただし、char(n) と varchar(n) では、n によって文字長がバイト (0-8,000) で定義されます。 n は、格納できる文字数を定義しません。 この概念は、 nchar と nvarchar の定義に似ています。

1 バイト エンコードを使用する場合、char および varchar のストレージ サイズは n バイトであり、文字数も n であるため、誤解が生じます。 しかしながら、UTF-8 などのマルチバイト エンコードの場合、より高い Unicode 範囲 (128 - 1,114,111) では 1 文字に 2 バイト以上が使用されることになります。 たとえば、char(10) として定義された列では、データベース エンジンで格納できる文字は、1 バイト エンコード (Unicode 範囲 0 - 127) を使用する場合は 10 文字ですが、マルチバイト エンコード (Unicode 範囲 128 - 1,114,111) を使用する場合は 10 文字未満です。 Unicode の格納と文字の範囲の詳細については、「UTF-8 と UTF-16 でのストレージの相違点」を参照してください。

解説参考先:https://learn.microsoft.com/ja-jp/sql/t-sql/data-types/char-and-varchar-transact-sql?view=sql-server-ver16

解決策:

インポートする際、余計なスペースを削除します。
これで、インポートは正常に行います。

2
  • 2

コメント欄