[Oracle] Oracle シリーズ 3 -- Oracle 文字セット

過去問題の復習

序文

1. 文字セットの定義

文字セット: 特定の文字エンコード方式に従って、特定の記号セットがコンピューターが処理できる値のセットにエンコードされます。

一般的な文字セット名: ASCII 文字セット、Unicode 文字セット、GB2312 文字セット、BIG5 文字セット、GB18030 文字セットなど。

各キャラクタ セットには異なる数の文字が含まれており、キャラクタ セットの変換プロセス中に、ソース キャラクタ セットの文字がターゲット キャラクタ セットで定義されていない場合、情報が失われます。

文字エンコーディング: 自然言語文字のセット (アルファベットや音節など) を別の文字セット (数字や電気パルスなど) と組み合わせることができる一連のルール。つまり、記号セットと数値体系との対応関係を確立することであり、したがって、文字エンコーディングは、言語記号をコンピュータが受け入れ可能な数値体系の数値に変換することです。

たとえば、Unicode は文字セットであり、UTF-8、UTF-16、および UTF-32 は 3 つの文字エンコード スキームです。

2. 一般的な文字セット

(1) ASCII (American Standard Code for Information Interchange、American Standard Code for Information Interchange)、シングルバイトのエンコーディング システム、7 ビット (ビット) で文字を表し、合計 128 文字、文字値の範囲は 0 ~ 127 、そのうち 32 ~ 126 は印刷可能な文字です。ASCII文字セットには、制御文字:エンターキー、バックスペースキー、改行キーなど、表示可能な文字:英大文字、小文字、アラビア数字、欧文記号が含まれます。

(2) Unicode (Universal Multiple-Octet Coded Character Set、Universal Multiple-Octet Coded Character Set) は、言語間およびプラットフォーム間のテキスト処理のニーズを満たすために、各言語の各文字に統一された一意のバイナリ エンコーディングを設定します。そしてエンコード方法。Unicode 標準では、16 進数の 4 バイトの数字を使用して各文字、記号、または表意文字を表し、記述時に「U+」という接頭辞が付けられます。

Unicode は文字セットであり、UTF-8、UTF-16、UTF-32 の 3 つの文字エンコード スキームがあります。

UTF-8 (8 ビット Unicode Transformation Format) は、Unicode の 8 ビット可変長文字エンコード方式であり、プレフィックス コードでもあります。AL32UTF8、UTF8、および UTFE は、UTF-8 でエンコードされた文字セットです。UTF-8 は 1 ~ 4 バイトを使用して各文字をエンコードし、Unicode 標準の任意の文字を表すために使用できます。また、そのエンコードの最初のバイトは引き続き ASCII と互換性があるため、UTF-8 は ASCII スーパーセットのバージョンです。純粋な ASCII 文字列も正当な UTF-8 文字列です。Internet Engineering Task Force (IETF) は、すべてのインターネット プロトコルが UTF-8 エンコーディングをサポートすることを要求しています。HTTP では、文字セットと文字エンコーディングに関連するメッセージ ヘッダーは Accept-Charset/Content-Type です。

UTF-16 (16 ビット Unicode Transformation Format) は、Unicode の 16 ビット エンコード方式です。Unicode 文字を表すために 2 バイトを使用する固定長のマルチバイト エンコードです。AF16UTF16 は、UTF-16 エンコード文字セットです。 。

(3) ANSI コード(American National Standards Institute、米国規格協会の標準コード) 国や地域によって規格が異なり、GB2312、BIG5、JIS などのコーディング規格が存在します。文字を表すために 2 バイトを使用するこれらのさまざまな中国語文字拡張エンコード方式は、ANSI エンコードと呼ばれます。簡体字中国語システムでは、ANSI エンコードは GB2312 エンコードを表し、日本語オペレーティング システムでは、ANSI エンコードは JIS エンコードを表します。異なる ANSI エンコードは相互に互換性がないため、情報が国際的に交換される場合、2 つの言語に属するテキストを同じ ANSI エンコード テキストに保存することはできません。Notepad プログラムは、デフォルトでドキュメントを ANSI エンコードで保存します。

(4) GB2312 (「GB 2312-1980 情報交換用中国語コード化文字セットの基本セット」) は、中国の国家標準の簡体字文字セットです。127 未満の文字の意味は前と同じですが、127 を超える 2 つの文字を連結すると漢字を表し、上位バイトは 0xA1 ~ 0xF7、下位バイトは 0xA1 ~ 0xFE になります。約7,000通りの組み合わせが可能 簡体字は漢字の使用頻度の99.75%をカバーしており、基本的に漢字のコンピュータ処理ニーズを満たしており、中国本土やシンガポールで広く使用されています。

GBK は GB-2312-80 の拡張機能です。GB-2312-80 の未使用のエンコード領域を使用して、GB13000.1-93 のすべての文字を含めるために Microsoft によって策定されたエンコードです。最初に簡体字中国語版で実装されました。ウィンドウズ95。

最新の内部コード文字セットである GB-18030 (GB 18030-2005「情報技術用中国語コード化文字セット」) は、GB 18030-2000「情報技術情報用中国語コード化文字セットの基本セットの拡張」の改訂版です。 Exchange」と同じで、GB 2312-1980 と完全に互換性があり、基本的に GBK と互換性があり、GB 13000 のすべての中国語文字と Unicode をサポートし、合計 70244 文字の中国語が含まれています。主な機能は次のとおりです。 UTF と同じ
-8 では、マルチバイト エンコーディングを使用し、各文字を 1 、2 または 4 バイトで表すことができます。
エンコード空間は巨大で、最大 161 万文字を定義できます。
中国の少数民族のキャラクターをサポートする場合、キャラクター作成エリアを使用する必要はありません。
漢字のコレクションには、繁体字中国語文字と日本および韓国語の中国語文字が含まれています。

(5) Big5 (Big Five または Big Five) は、繁体字中国語 (繁体字中国語) コミュニティで最も一般的に使用されているコンピューター中国語文字セット標準であり、合計 13,060 個の漢字が含まれています。中国のコードは内部コードと交換コードの 2 つのカテゴリに分類され、Big5 は中国の内部コードに属し、よく知られた中国の交換コードには CCCII と CNS11643 があります。Big5 コードは、2 バイトの文字セットであり、ダブル オクテットの保存方法を使用して 1 つの単語を 2 バイトで保存します。最初のバイトは「上位バイト」と呼ばれ、2 番目のバイトは「下位バイト」と呼ばれます。「上位バイト」は 0x81 ~ 0xFE を使用し、「下位バイト」は 0x40 ~ 0x7E および 0xA1 ~ 0xFE を使用します。

3. Oracle の文字セット

Oracle の文字セットの命名は、次の命名規則に従います。

<Language><bit size><encoding>

つまり: <言語><ビット数><エンコーディング>

例: ZHS16GBK は、GBK エンコード形式、16 ビット (2 バイト) 簡体字中国語文字セット
WE8ISO8859P1 (西ヨーロッパ、8 ビット、ISO 標準 8859P1 エンコード) を使用することを意味します。

3.1 Oracle サーバー側の文字セット

データベースを作成するときは、キャラクタ セットと各国語キャラクタ セット (create database の CHARACTER SET 句と NATIONAL CHARACTER SET 句で指定) を選択する必要があります。

英語のみを保存する必要がある場合は、文字セットとして US7ASCII を選択できます。中国語を保存したい場合は、中国語をサポートできる文字セット (ZHS16GBK など) を選択する必要があります。多言語文字を保存したい場合は、文字セットとして選択する必要があります。 、UTF8を選択する必要があります。

データベース キャラクタ セットの決定は、実際にはデータベースが処理できる文字セットとそのエンコード方法を示します。キャラクタ セットを選択した後の変更には多くの制限があるため、データベースの作成時に慎重に検討してから選択する必要があります。 . (WE8ISO8859P1 や US7ASCII などのデフォルトの文字セットには中国語の文字エンコーディングがありません)。

データ ディクショナリまたは v$ ビューをクエリすることで、Oracle サーバー側の文字セットを表示できます。

クエリ文は次のとおりです。

SQL>select userenv(language) from dual;
SQL>select * from nls_database_parameters where parameter='NLS_CHARACTERSET'
SQL>select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
  • NLS_DATABASE_PARAMETERS: props$ から取得され、データベースの現在の NLS パラメータ値 (データベース キャラクタ セット値を含む) が表示されます。
  • NLS_INSTANCE_PARAMETERS: v$parameter から取得され、サーバーの文字セット設定を示します。これはパラメータ ファイル、環境変数、またはレジストリである可能性があります。
  • NLS_SESSION_PARAMETERS: v$nls_parameters から取得され、セッション独自の設定を示します。これは、セッションの環境変数またはセッション変更後のパラメータ値である可能性があります(NLS_LANGによって設定されたクライアント文字セットを除く)。セッションに特別な設定がない場合は、nls_instance_parameters と一致します。
  • V$NLS_PARAMETERS: データベースの現在の NLS パラメータ値を表示します。
    文字セットを変更する必要がある場合は、通常、データベース データをエクスポートし、データベースを再構築してから、変換のためにデータベース データをインポートする必要があります。

データベース作成後のキャラクタ セットの変更には制限があり、データベース キャラクタ セットは、新しいキャラクタ セットが現在のキャラクタ セットのスーパーセットである場合にのみ変更できます。

1 つの文字セット (文字セット A) のエンコード値が別の文字セット (文字セット B) のエンコード値をすべて含み、2 つの文字セットで同じエンコード値が含まれる場合が同じ文字を表す場合、キャラクタ セット A はキャラクタ セット B のスーパー、つまりキャラクタ セット B はキャラクタ セット A のサブセットです。

たとえば、UTF8 は US7ASCII のスーパーセットです。データベースの文字セットを変更するには、次のステートメントを使用できます。

SQL>ALTER DATABASE CHARACTER SET UTF8

3.2 Oracle クライアントの文字セット

クライアント文字セットは、クライアント文字データのエンコード方法を定義します。クライアントとの間で送受信される文字データは、クライアントによって定義された文字セットを使用してエンコードされます。クライアントは、データベースに直接接続できるさまざまなアプリケーションとみなすことができます。たとえば、sqlplus、exp/imp など。

クライアント文字セットは、NLS_LANG パラメータを設定することによって設定されます。NLS_LANG は次の部分で構成されます。

< Language>_<Territory>.<Clients Characterset>

例: AMERICAN_AMERICA.ZHS16GBK。

  • 言語: メッセージの言語を指定します。プロンプト メッセージが中国語か英語かに影響します。
  • 地域: デフォルトの日付と数値の形式を指定します。
  • クライアント文字セット: 文字セットを指定します。これは、クライアント オペレーティング システムでデフォルトで使用される文字セットを示すことを目的としています。したがって、通常の使用法に従って、NLS_LANG はクライアント マシンの実際の状況に応じて設定する必要があります。データベースのキャラクタ セットに実際に影響を与えるのは 3 番目の部分です。3 番目の部分では、2 つのデータベース間の文字セットが同じである限り、データを相互にインポートおよびエクスポートできます。以前の影響は、プロンプト情報が中国語であるか英語であるかにのみ影響します。

NLS アクションの優先順位:

SQL 関数 > セッションの変更 > 環境変数またはレジストリ > パラメータ ファイル > データベースのデフォルト パラメータ
Oracle クライアントの文字セットを問い合わせる

ウィンドウズ:

set nls_lang

ユニックス:

echo $NLS_LANG

チェックの結果、サーバー側の文字セットがクライアント側の文字セットと一致していないことが判明した場合は、サーバー側と同じ文字セットに変更する必要があります。

ウィンドウズ:

set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

または、レジストリを変更します: Regedit.exe –>HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE-HOME

ユニックス:

export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

または、oracle ユーザーのプロファイル ファイルを編集します

3.3 Oracle のインポート/エクスポート文字セット

exp を使用してデータをエクスポートするときは、imp をインポートするときに ORACLE キャラクタ セットの問題に注意する必要があります。ソース データベースからターゲット データベースへのデータのプロセスには、キャラクタ セットが関係する 4 つのリンクがあります。

(1) ソース データベースのキャラクタ セット
(2) エクスポート プロセス中のユーザー セッションのキャラクタ セット (NLS_LANG を通じて設定)
(3) インポート プロセス中のユーザー セッションのキャラクタ セット (NLS_LANG を通じて設定)
(4) ターゲット データベースのキャラクタ セット
上記には 3 つの要素が含まれます。側面 文字セット:

Oracle サーバー側のキャラクタ セット
Oracle クライアント側のキャラクタ セット
dmp ファイルのキャラクタ セット
データをインポートする場合、正しくインポートするには、これら 3 つのキャラクタ セットが一致している必要があります。

Oracle の exp ツールを使用してエクスポートされた dmp ファイルには、キャラクタ セット情報も含まれています。dmp ファイルの 2 番目と 3 番目のバイトには、dmp ファイルのキャラクタ セットが記録されます。
dmp ファイルがわずか数 M または数十 M など、大きくない場合は、UltraEdit (16 進モード) でファイルを開き、2 バイト目と 3 バイト目 (0354 など) の内容を確認してから、次の SQL を実行して、対応する文字セットを見つけます。

SQL> select nls_charset_name(to_number('0354''xxxx')) from dual;
ZHS16GBK

dmp ファイルが 2G を超えるなど非常に大きく (これも最も一般的な状況です)、テキスト エディタで開くのが非常に遅いか、まったく開けない場合は、次のコマンドを使用できます (コンピュータ上で)。 Unix ホスト):

cat exp.dmp |od -x|head -1|awk '{
    
    print $2 $3}'|cut -c 3-6

おすすめ

転載: blog.csdn.net/u011397981/article/details/133047093