列データ型のBYTEとCHARの違い


166

Oracleでは、違いは何ですか?

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

そして

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)

回答:


265

データベースの文字セットがUTF-8であるとします。これは、Oracleの最近のバージョンで推奨されている設定です。この場合、一部の文字はデータベースに格納するのに1バイト以上かかります。

フィールドをとして定義するとVARCHAR2(11 BYTE)、Oracleは最大11バイトのストレージを使用できますが、実際にはフィールドに11文字を格納できない場合があります。これは、英語以外の文字など、一部のバイトを格納するために1バイトを超えるためです。

VARCHAR2(11 CHAR)Oracleに指示したとおりにフィールドを定義することにより、各文字を格納するのに必要なバイト数に関係なく、11文字を格納するのに十分なスペースを使用できます。1つの文字に最大4バイトが必要な場合があります。


55
文字長セマンティクスは、の最大長4000バイトには影響しないことに注意してくださいVARCHAR2VARCHAR2(4000 CHAR)一部の文字が複数バイトのストレージを必要とする場合、a を宣言すると4000文字未満が許可されます。
ジャスティンケイブ

@David Sykesこれは意味的にNVARCHAR(11)と同じですか?
ナップ

@Nap私の知る限りではありません。NVARCHAR型宣言のサイズパラメータには、VARCHAR2と同じ意味があると思います。つまり、NVARCHAR文字セットの11文字(バイトではない)に十分なストレージスペースを確保するには、NVARCHAR(11 CHAR)と言います。注:実際には確認していません。NVARCHARを使用したことがありません。
David Sykes、2015年

2つの違いをさらに説明すると、16進エンコードされた値の4文字(つまり "0xFF")または3つの10進文字(つまり "255")は、1バイトとして表現されると "圧縮"されます:11111111。ビットフラグ(最大8つの設定)、ビット単位の操作などに役立ちます
Matt Borja

注ビットは00000001であるとして、ASCII文字として1(12月49。)が1に対し、1001001であること
マット・ボルハ

21

1つは正確に11バイトのスペース、もう1つは正確に11文字のスペースです。Unicodeバリアントなどの一部の文字セットでは、1文字あたり複数のバイトが使用される場合があるため、エンコーディングによっては、11バイトのフィールドに11文字未満のスペースがある場合があります。

http://www.joelonsoftware.com/articles/Unicode.html参照してください


17

システム構成によっては、BYTESで測定されるCHARのサイズが異なる場合があります。あなたの例では:

  1. フィールドを11 バイトに制限
  2. フィールドを11 文字の文字に制限します


結論:1 CHARは1 BYTEと等しくありません。


4

私はOracleユーザーではないのでわかりませんが、Unicode(UTF-16 / 32)などのマルチバイト文字セットを使用するときに違いがあると思います。この場合、11バイトは11文字未満を占める可能性があります。

また、これらのフィールドタイプは、アクセント付きの文字または大文字小文字の区別が異なる場合があります。たとえば、 'binaryField(ete)= "été"'は一致しませんが、 'charField(ete)= "été"'は一致します(Oracleについては不明です)。 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.