本記事では、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の場合、サーバーは受信したSQLステートメントをGBKで解析および実行します。
クライアントの文字セットがUTF8の場合、サーバーは受信した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:サーバーがクライアントに返す結果の文字セット。
一般的に、クライアントからサーバーへ、およびサーバーからクライアントへの文字列の文字セットは統一されています。そのため、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リンクに設定するだけでなく、クライアントとドライバーも対応する設定を行う必要があります。環境設定が誤っていると、文字化けが発生する可能性があります。