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