本記事では、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リンクに設定するだけでなく、クライアントとドライバーも対応する設定を行う必要があります。環境設定が誤っていると、文字化けが発生する可能性があります。