多数のパッケージグローバル定数文字列を次のように定義するパッケージに出くわしました:
DESTINATION_1 CONSTANT VARCHAR2(13) := '515 Pine Lane';
DESTINATION_2 CONSTANT VARCHAR2(18) := '670 Woodhaven Lane';
varchar2
これらの over のデータ型として使用する利点はありますchar
か?
Oracle 11g リリース 2 を使用しています。
一般に、すべての文字列変数または定数の宣言に CHAR の代わりに VARCHAR2 を使用します。これは、VARCHAR2 のセマンティクスの方が期待どおりであるという単純な理由からです。ここでの問題は、開発者が定数の長さのカウントについて正確ではない場合、CHAR として宣言されている場合は右側に空白が埋め込まれ、VARCHAR2 として宣言されている場合はパディングなしで単純に格納されることです。検討:
DECLARE
strFixed CHAR(20) := 'This is a string';
strVariable VARCHAR2(20) := 'This is a string';
BEGIN
IF strFixed = strVariable THEN
DBMS_OUTPUT.PUT_LINE('Equal');
ELSE
DBMS_OUTPUT.PUT_LINE('Not equal');
END IF;
END;
一見、「等しい」と出力されると思われるかもしれませんが、実際には「等しくない」と出力されます。これは、strFixed が 'This is a string' として格納されていないためです。代わりに、「これは文字列です」として格納されます。これは、CHAR 変数の右側が、変数宣言で指定されたサイズまで空白で埋められるためです。ところで)宣言を慎重に調整しましたが、それはちょうど1970年代のことです (この 10 年間のことは、ややぼんやりと覚えているので、再訪する気にはなりません :-). そして、ああ、文字列の文字数を数え間違えました。うまくいかなかったでしょう。
VARCHAR2 の代わりに CHAR を使用する 1 つのケースは、constant の変数が 1 文字の長さだけであると想定されている場合です。VARCHAR2(1) として何かを宣言する IMO は間違っています。:-)
ちなみに、パッケージ SYS.STANDARD を見ると、CHAR が次のように宣言されていることがわかります。
subtype CHAR is VARCHAR2;
したがって、CHARはVARCHAR2 です。スペースの埋め込みがどのように行われるかはわかりませんが、実行時にスペースの埋め込みが行われるため、時間が追加される可能性があります。
どちらか一方にパフォーマンス上の利点はありますか? せいぜい多くはないでしょう。CHAR変数にスペースパディングがある場合、同等のパディングされていないVARCHAR2値よりも比較に時間がかかると思いますが、実際には、これが問題になるとは思いません。また、スペースの埋め込みは実行時に行われるため、時間がかかります。私はそれがウォッシュだと思っており、確かに SQL 効果に圧倒されるでしょう。
共有してお楽しみください。
CHAR データ型と VARCHAR2 データ型は同じように格納されます...したがって、説明した場合、違いはありません。
CHAR と VARCHAR の違いは、CHAR(n) は常に N バイトの長さであり、これを保証するために挿入時に空白が埋められることです。一方、varchar2(n) は 1 ~ N バイトの長さで、空白は埋め込まれません。
こんにちは、これは私の仮定かもしれませんが、パフォーマンスのために varchar2 が使用されている可能性があります。
char は、最大長まで埋められた単なる varchar2 ブランクです。
create table t ( x varchar2(30), y char(30) );
insert into t (x,y) values ( rpad('a',' ',30), 'a' );
絶対に何もありません。以下の列 X と Y の違いを考えると、
insert into t (x,y) values ('a','a')
X は 3 バイト (null インジケータ、先頭のバイト長、'a' の場合は 1 バイト) を消費し、Y は 32 バイト (null インジケータ、先頭のバイト長、'a ' の場合は 30 バイト) を消費します。
うーん、varchar2 は「パフォーマンス面で有利」になるでしょう。char(30) が常に 30 バイトであることはまったく役に立ちません。私たちにとっては、最大長まで空白が埋め込まれた varchar2 にすぎません。