私はdatabase
にはあまり興味がなく、次の疑問があります。
varchar2
含めることができる文字の番号を使用したフィールド。
しかし、作業中のOracle
データベースに、フィールド(PDFという名前)が次のように定義されていることがわかりました。
VARCHAR2(1 BYTE)
正確にはどういう意味ですか?何文字が含まれていますか?
もう1つの疑問は、VARCHAR
フィールドとVARCHAR2
フィールド?
Tnx
列/変数をvarchar2(n CHAR)およびvarchar2(n byte)として宣言できます。
n CHARは、変数がn文字を保持することを意味します。マルチバイト文字セットでは、保存するバイト数が常にわからない場合がありますが、一定量の文字の保存を保証する必要があります。
nバイトは、単に保存したいバイト数を意味します。
varcharは非推奨です。使用しないでください。 varcharとvarchar2の違いは何ですか?
VARCHAR
datatype は_VARCHAR2
_データ型と同義です。動作の変更を回避するには、常に_VARCHAR2
_データ型を使用して可変長文字列を格納します。
データベースがシングルバイト文字セット(たとえば_US7ASCII
_、_WE8MSWIN1252
_、または_WE8ISO8859P1
_)で実行されている場合、VARCHAR2(x BYTE)
を使用してもVARCHAR2(x CHAR)
。
DBがマルチバイト文字セット(_AL32UTF8
_または_AL16UTF16
_)で実行されている場合にのみ違いが生じます。この例で簡単に見ることができます:
_CREATE TABLE my_table (
VARCHAR2_byte VARCHAR2(1 BYTE),
VARCHAR2_char VARCHAR2(1 CHAR)
);
INSERT INTO my_table (VARCHAR2_char) VALUES ('€');
1 row created.
INSERT INTO my_table (VARCHAR2_char) VALUES ('ü');
1 row created.
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€');
INSERT INTO my_table (VARCHAR2_byte) VALUES ('€')
Error at line 10
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 3, maximum: 1)
INSERT INTO my_table (VARCHAR2_byte) VALUES ('ü')
Error at line 11
ORA-12899: value too large for column "MY_TABLE"."VARCHAR2_BYTE" (actual: 2, maximum: 1)
_
VARCHAR2(1 CHAR)
は、バイト数に関係なく、1文字まで保存できることを意味します。 Unicodeの場合、1文字が最大4バイトを占める場合があります。
VARCHAR2(1 BYTE)
は、最大を占める文字を保存できることを意味します。 1バイト。
BYTE
またはCHAR
のいずれも指定しない場合、デフォルトは_NLS_LENGTH_SEMANTICS
_セッションパラメーターから取得されます。
_MAX_STRING_SIZE=EXTENDED
_を設定できるOracle 12cがない限り、制限はVARCHAR2(4000 CHAR)
です
ただし、、VARCHAR2(4000 CHAR)
は、最大4000文字を格納できることを保証するものではありません。制限はまだ4000bytesであるため、最悪の場合、そのようなフィールドには最大1000文字しか格納できません。
この例を参照してください(UTF-8の_€
_は3バイトを占有します):
_CREATE TABLE my_table2(VARCHAR2_char VARCHAR2(4000 CHAR));
BEGIN
INSERT INTO my_table2 VALUES ('€€€€€€€€€€');
FOR i IN 1..7 LOOP
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
END LOOP;
END;
/
SELECT LENGTHB(VARCHAR2_char) , LENGTHC(VARCHAR2_char) FROM my_table2;
LENGTHB(VARCHAR2_CHAR) LENGTHC(VARCHAR2_CHAR)
---------------------- ----------------------
3840 1280
1 row selected.
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char;
UPDATE my_table2 SET VARCHAR2_char = VARCHAR2_char ||VARCHAR2_char
Error at line 1
ORA-01489: result of string concatenation is too long
_
BYTEおよびCHARセマンティクスの使用例と制限(NLS_LENGTH_SEMANTICS)(Doc ID 144808.1)
最初の質問に答えるには:
はい、1文字に1バイトが割り当てられることを意味します。この例を見てください
SQL> conn / as sysdba
Connected.
SQL> create table test (id number(10), v_char varchar2(10));
Table created.
SQL> insert into test values(11111111111,'darshan');
insert into test values(11111111111,'darshan')
*
ERROR at line 1:
ORA-01438: value larger than specified precision allows for this column
SQL> insert into test values(11111,'darshandarsh');
insert into test values(11111,'darshandarsh')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TEST"."V_CHAR" (actual: 12,
maximum: 10)
SQL> insert into test values(111,'Darshan');
1 row created.
SQL>
そして次の質問に答えるために:varchar2
とvarchar
の違い:
VARCHAR
は2000 bytes
までの文字を保存でき、VARCHAR2
は4000 bytes
までの文字を保存できます。VARCHAR
として宣言すると、NULL values
のスペースを占有します。VARCHAR2
データ型の場合、not
はスペースを占有します。つまり、文字ごとに1バイトのみが割り当てられることを意味します。したがって、マルチバイト文字セットを使用している場合、1文字は収まりません。
少なくとも1文字分のスペースが必要なことがわかっている場合は、そのバイトを格納する必要があるスペースが正確にわからない限り、BYTE構文を使用しないでください。
疑わしい場合は、VARCHAR2(1 CHAR)を使用します
ここで同じことが答えられました 列データ型のBYTEとCHARの違い
また、12cでは、varchar2の最大値は4000ではなく32kになりました。それ以上必要な場合は、CLOBを使用してください
oracleでは、VARCHARを使用しないでください