sql >> データベース >  >> RDS >> Oracle

Varchar2とcharの主な違いは何ですか

    charの動作を正しく説明する答えはすでにいくつかありますが 、使用しないでくださいと言う必要があると思います 3つの特定の状況を除いて:

    1. 固定長のファイルまたはレポートを作成し、null以外の値をcharに割り当てています。 rpad()をコーディングする必要がなくなります 表現。たとえば、firstname およびlastname どちらもchar(20)として定義されています 、次にfirstname || lastname rpad(firstname,20) || rpad(lastname,20) Chuck Norris を作成するには 。
    2. 明示的な空の文字列''を区別する必要があります およびnull 。通常、これらはOracleでも同じですが、''を割り当てます。 charに 値は、nullの間、空白のパディング動作をトリガーします そうではないので、違いを伝えることが重要であり、その理由が本当に考えられない場合は、それを行う方法があります。
    3. コードは、レガシーの理由で空白のパディングを必要とする他のシステムから移植されています(または互換性が必要です)。その場合、あなたはそれに固執し、あなたは私の同情を持っています。

    本当にcharを使用する理由はありません 一部の長さが固定されているという理由だけで(例:Y/N フラグまたは'USD'などのISO通貨コード )。これは効率的ではなく、スペースを節約しません(varchar2の神話上の長さインジケーターはありません) 、charには空白のパディングオーバーヘッドがあります )、そしてそれは誰もがより短い値を入力するのを止めません。 ('ZZ 'と入力した場合 char(3)で 通貨列。'ZZ 'として保存されます。 。)これまで依存していたOracleの古いバージョンとの下位互換性すらありません。これは、Oracleが存在しなかったためです。

    また、(ベストプラクティスに従って)sales.currency%typeのようなものを使用して変数宣言を固定すると、伝染が広がる可能性があります。 。これで、l_sale_currency 変数はステルスchar 短い値(または''の場合は、目に見えないほど空白が埋め込まれます )、l_sale_currencyのバグを隠すための扉を開く l_refund_currencyと等しくありません 'ZZ 'を割り当てた場合でも 両方に。

    char(n)と主張する人もいます (ここで n は文字の長さです)は、値が nであると予想されることを示します 文字は長く、これは自己文書化の一形態です。ただし、3文字の形式(たとえば、ISO-Alpha-2ではなくISO-Alpha-3の国コード)を真剣に考えている場合は、開発者に一瞥させるのではなく、ルールを適用するための制約を定義しませんか。 char(3) データ型と独自の結論を導き出しますか?

    CHAR 確かに、ANSI互換性の理由から、Oracle6で導入されました。おそらく、購入するデータベース製品とANSI互換性を決定する潜在的な顧客がいるでしょう。 チェックリストに載っている(または当時は)、CHAR 空白パディングはANSI規格で定義されているため、Oracleが提供する必要があります。実際に使用することは想定されていません。



    1. SQLServerでEXISTS論理演算子を使用する方法-SQLServer/TSQLチュートリアルパート125

    2. SQLServerとStateServerforASP.NETセッション状態のパフォーマンス

    3. postgreSQLでアクセントを削除する関数

    4. PL / SQLでファイルを解凍するにはどうすればよいですか?