web-dev-qa-db-ja.com

VARCHAR2フィールドのサイズが1バイトとして宣言されていることを正確にはどういう意味ですか? (Oracle DBへ)

私はdatabaseにはあまり興味がなく、次の疑問があります。

varchar2含めることができる文字の番号を使用したフィールド。

しかし、作業中のOracleデータベースに、フィールド(PDFという名前)が次のように定義されていることがわかりました。

VARCHAR2(1 BYTE)

正確にはどういう意味ですか?何文字が含まれていますか?

もう1つの疑問は、VARCHARフィールドとVARCHAR2フィールド?

Tnx

16
AndreaNobili

列/変数をvarchar2(n CHAR)およびvarchar2(n byte)として宣言できます。

n CHARは、変数がn文字を保持することを意味します。マルチバイト文字セットでは、保存するバイト数が常にわからない場合がありますが、一定量の文字の保存を保証する必要があります。

nバイトは、単に保存したいバイト数を意味します。

varcharは非推奨です。使用しないでください。 varcharとvarchar2の違いは何ですか?

21
Rene

VARCHARdatatype は_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)

10

最初の質問に答えるには:
はい、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> 

そして次の質問に答えるために:varchar2varcharの違い:

  1. VARCHAR2000 bytesまでの文字を保存でき、VARCHAR24000 bytesまでの文字を保存できます。
  2. データ型をVARCHARとして宣言すると、NULL valuesのスペースを占有します。VARCHAR2データ型の場合、notはスペースを占有します。
6
Darshan Lila

つまり、文字ごとに1バイトのみが割り当てられることを意味します。したがって、マルチバイト文字セットを使用している場合、1文字は収まりません。

少なくとも1文字分のスペースが必要なことがわかっている場合は、そのバイトを格納する必要があるスペースが正確にわからない限り、BYTE構文を使用しないでください。

疑わしい場合は、VARCHAR2(1 CHAR)を使用します

ここで同じことが答えられました 列データ型のBYTEとCHARの違い

また、12cでは、varchar2の最大値は4000ではなく32kになりました。それ以上必要な場合は、CLOBを使用してください

oracleでは、VARCHARを使用しないでください

3
thatjeffsmith