3

状況:

varchar(20)Teradataでは静かに切り捨てられ、20文字を超える文字列に遭遇しても拡張または文句を言わないようです...これは、列を30文字などのより大きな文字列に合わせて自動拡張することを期待していたため、少し驚きです。より大きな文字列が検出された場合にスローされるエラー。サイレント切り捨ては、私をすべての世界の中で最悪の状態にさせるようです...

合併症:

私のアプリケーション(プロトタイプ分析設計)の場合、数週間の間に取り込むデータの大きさは事前にわかりません。maxを除いて、varchar(N)の使用は除外されているようです。

質問:

だから今、私はいくつかの選択肢があり、いくつかのガイダンスを探しています:

Q1。ユーザーエラー?私はについての重要な概念を誤解していますvarchar(N)か?

これが実際にTeradataがvarcharフィールドを処理する方法である場合、

Q2。varchar(max)フィールドに何文字を格納する必要があるかが事前に明確でない場合、なぜ誰かが特に以下のものを指定するのでしょうか。

Q3。文字列の柔軟なサイズ設定を可能にする別のデータ型、つまり真の可変長文字列はありますか?

思い出してください。他のSQLダイアレクトvarchar(n)は、文字列の推奨初期サイズとして実装されていますが、スローされるデータ文字列の最大長に合わせて必要に応じて拡張できます。Teradataにも同様のデータ型がありますか?

(注:私はテーブルのプロトタイプを作成しているので、この時点ではパフォーマンスの効率についてはあまり心配していません。プロトタイプを進行させるための迅速で安全な設計についてはもっと心配しています。)

4

2 に答える 2

2

私はあなたが提案するように振る舞うvarchar(n)を実装するSQLの方言に精通していません-推奨される初期サイズとそれを成長させます。これは、Oracle、SQL Server、MySQL、およびPostgresに適用されます。これらすべてのデータベースで、varchar(n)は、明示的なキャストを使用したSELECTステートメントのTeradataで動作するのとほぼ同じように動作します。長い文字列を短い文字列に配置しても、切り捨てエラーが発生することはないと思います。

Brankoがコメントで指摘しているように、データ変更ステップでは動作が異なり、暗黙のキャストによってエラーが発生します。

私はTeradataのすべての詳細に精通していません。SQL Serverでは、歴史的にvarchar(max)とvarchar(8000)の間に違いの世界があります。前者は別のデータページに割り当てられ、後者はデータと同じページに割り当てられます。(ルールは最近のバージョンで変更されているため、varcharはデータページから流出する可能性があります。)

言い換えると、varchar(max)を使用する場合、データがページに格納される方法、インデックスがページ上に構築される方法、およびおそらく他の考慮事項を含む、他の考慮事項がある可能性があります。

私の提案は、適度に大きいサイズ、たとえば1000程度を選択し、そこからアプリケーションを続行させることです。本当の柔軟性が必要な場合は、varchar(max)を使用してください。また、Teradataのドキュメントや技術的な連絡先を通じて、非常に大きな文字列を宣言する際の問題を調査する必要があります。

于 2012-08-23T02:27:23.423 に答える
1

Teradataは、Teradata(BT; .. ET;)とANSI(commit;)の2つのモードで動作します。それらには相違点のリストがあり、開発中に出会ったものの1つです。Teradataモードでは表示データを切り捨てることができます。それどころか、ANSIはそのような切り捨てを禁止しているため、エラーが表示されます。アイデアを得るには、簡単な例を使用してください。create table check_exec_mode(str varchar(5)); select * from check_exec_mode; check_exec_mode値に挿入します( '123456'); TMODE(transaction mode)= TERAでteradataクライアント(Teradata Studio Expressなど)の接続を構成すると、結果としてテーブルに1つの切り捨てられた行( '12345')が表示されます。トランザクションモードをANSIに変更し、挿入ステートメントを実行すると、「文字列データの正しい切り捨て」というエラーが発生します。

于 2015-06-30T17:12:48.917 に答える