本記事では、OceanBaseにおける文字セット選択の仕様について説明します。
ユーザーはテナントレベル、データベースレベル、テーブルレベル、フィールドレベル、セッションレベルで文字セットを設定できます。現在、OceanBaseはutf8mb4、gbk、gb18030、binary、utf16などの文字セットをサポートしています。
説明
- シームレスな移行をサポートするため、OceanBaseは構文上、
UTF8をUTF8MB4のシノニムと見なします。 - データベースの文字セットは、現時点では変更できません。
gbk文字セットを例に説明します:
テナント作成時の文字セットの設定
create tenantステートメントにcharset設定を追加し、
"charset=gbk"を追加できます。create tenant oracle replica_num = 1, resource_pool_list =('pool1'), charset = gbk set ob_tcp_invited_nodes = '%', ob_compatibility_mode = 'oracle', parallel_servers_target = 10, ob_sql_work_area_percentage = 20, secure_file_priv = "";OCPでテナントを作成する際に、文字セットをgbkに設定できます。
注意
- Oracleモードの文字セットはテナントレベルです。gbkテナントでは、すべてのユーザーテーブルのchar、varchar2、clobフィールドがgbk文字セットであり、システムテーブルのchar、varchar2などのフィールドは引き続きutf8文字セットを保持します。
- Oracleモードのテナント文字セットは変更できません。つまり、
alterステートメントを使用してテナント、データベース、テーブル、列の文字セットを変更することはできません。
クライアント(リンク)文字セットの設定
クライアント(リンク)文字セットは、ClientとServer間のやり取りで使用する文字セット設定です。
ClientはSQL文字列をServerに送信して実行し、Serverは実行結果をClientに返します。このプロセスにおいて、ServerはClientが使用する文字セットを明確に把握していないと、正しく解析、実行、結果を返すことができません。異なる環境において、ClientはOBClient、jdbc、OCIなどとなり得るため、リンク文字セットと呼ばれることもあります。
テナント文字セットとクライアント文字セットは直接関係がなく、相互に独立して設定されます。
GBKテナントは、GBKのクライアントから接続することも、UTF8のクライアントから接続することもできます。
クライアント文字セットがGBKの場合、Serverは受信したSQLステートメントをGBKで解析および実行します。
クライアント文字セットがUTF8の場合、Serverは受信したSQLステートメントをUTF8で解析および実行します。
設定方法
永続的な変更
set global character_set_client = gbk; set global character_set_connection = gbk; set global character_set_results = gbk;character_set_client:クライアント文字セット。
character_set_connection:接続文字セット。oracleテナントでは、character_set_clientと一致する値に設定する必要があります。
character_set_results:ServerがClientに返す結果の文字セット。
一般的に、クライアントからサーバーへ、およびサーバーからクライアントへの文字列の文字セットは統一されているため、Oracleモードのテナントでは、これら3つの値は一致させるべきです。MySQLモードでは、3つの変数を使用することで柔軟な設定が可能であり、一般的な使用シナリオでは、3つの変数をすべてクライアントの文字セットに設定するだけで十分です。
一時的な変更(このセッションにのみ有効)
方法1:
set character_set_client = gbk; set character_set_connection = gbk; set character_set_results = gbk;方法2:
set names gbk;
クライアント文字セットの設定
jdbcを使用してOceanBaseデータベースに接続する場合、GBKリンクでは通常、url内でパラメータ設定を変更し、
characterEncoding=gbkを追加します。String url = "jdbc:oceanbase://xxx.xxx.xxx.xxx:xxxx?useSSL=false&useUnicode=true&characterEncoding=gbk&connectTimeout=30000&rewriteBatchedStatements=true";OBClientクライアントを使用してデータベースに接続する場合、GBKリンクbash環境変数として、
zh_CN.GBKのスーパーセットであるzh_CN.GB18030を推奨します。bash環境変数の変更
export LANG=zh_CN.GB18030 export LC_ALL=zh_CN.GB18030ターミナルのエンコーディング設定を変更し、現在のウィンドウをgbkエンコーディングに設定します。ターミナル画面の指示に従って操作してください。
注意
データベース(observerプロセス)をGBKリンクに設定するだけでなく、クライアントやドライバーも対応する設定を行う必要があります。環境設定が誤っていると、文字化けが表示される可能性があります。