2005-08-12

MySQLの実験(1) - システム変数の参照と変更

MySQLサーバには多くのシステム変数があります。システム変数にはデフォルト値が存在しますが、サーバ起動時のコマンドラインオプションや、オプションファイル(my.ini)で設定する事ができます。多くのシステム変数はSET文で変更する事ができます。

MySQL 4.0.3から、MySQLサーバは2種類のシステム変数(グローバル変数セッション変数)を保持するようになりました。グローバル変数はサーバ起動時に設定される変数で、SET GLOBAL 文によって変更できます。但し、変更するにはSUPER権限が必要になります。一方、セッション変数は各接続に対して保持される変数で、接続時にグローバル変数によって初期化されます。セッション変数の変更はSET SESSION 文によって変更できます。変更に当たっては特別な権限は必要としませんが、変更できるのは自分のセッション変数だけです。

システム変数 - version

システム変数versionを参照します。ブラウザから http://localhost/mysql/sqlfile.cgi?syaval1.sql を実行します。

syaval1.sql

SHOW VARIABLES LIKE 'version';
SELECT @@version;

実行結果

perl-exp02.gif

システム変数versionはMySQLサーバのバージョンです。本編ではWindowsNT/2000/XP用の標準MySQLサーバ(mysqld-nt.exe)が稼動しています。拡張MySQLサーバ(mysqld-max-nt.exe)が稼動している場合、この変数は以下のようになります。

4.1.10a-nt-max

システム変数は 構文:SELECT @@variable_name でも参照できます。この構文は他のデータベースとの互換性を保持する為にサポートされています。

システム変数 - storage_engine

システム変数storage_engineを変更してみます。ブラウザから http://localhost/mysql/sqlfile.cgi?syaval2.sql を実行します。

syaval2.sql

SET storage_engine=MyISAM;
SHOW SESSION VARIABLES LIKE 'storage_engine';
SHOW GLOBAL VARIABLES LIKE 'storage_engine';
SHOW VARIABLES LIKE 'storage_engine';

実行結果

perl-exp01.gif

システム変数storage_engineは CREATE TABLE で使用されるデフォルトのテーブルタイプです。本編ではmy.iniの[mysqld]セクション中でシステム変数storage_engineを以下のように設定しています。

default-storage-engine=InnoDB

この例では、セッション変数storage_engineをSET文でMyISAMに変更しています。実行結果を見ても分かるようにセッション変数の変更はグローバル変数には影響しません。SETまたはSHOW文で SESSION/GLOBALを省略するとSESSIONとして扱われます。SHOWでlike節を省略すると全ての変数を表示します。

文字セット関連のシステム変数

文字セット関連のシステム変数を取得してみます。ブラウザから http://localhost/mysql/sqlfile.cgi?syaval3.sql を実行します。

syaval3.sql

SHOW GLOBAL VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'character\_set\_%';

実行結果

perl-exp03.gif

MySQL 4.1ではサーバーとクライアントがそれぞれの別の文字セットで動作します。従って、現状の文字セット環境を把握しておく事が重要です。

筆者の実験では、character_set_system以外のグローバル変数はサーバ起動時のオプション(default-character-set)に設定されました。セッション変数の方は、character_set_databaseはデフォルトデータベース(test)の文字セットになり、character_set_serverはグローバル変数と同じになりました。また、クライアントとの接続に関係する3つのセッション変数(character_set_client, character_set_results, character_set_connection)はlatin1になっています。これは、クライアントライブラリにより設定されたものと思われます。latin1はASCIIコードに西ヨーロッパ諸国のアルファベットや記号を追加した8ビット系のコードです。このままの状態では漢字の使用ができません。要注意です。

以下に、それぞれのシステム変数について簡単に説明します。詳細は、以下のURLを参照して下さい。

http://dev.mysql.com/doc/mysql/en/server-system-variables.html
http://dev.mysql.com/doc/mysql/en/charset-defaults.html

character_set_client

クライアントの使用する文字セットです。サーバへのSQL文はこの文字セットで送信します。

character_set_connection

サーバーはクライアントからのSQL文をcharacter_set_clientからcharacter_set_connectionに変換します。

character_set_database

デフォルトデータベースの文字セットです。USE文などでデフォルトデータベースを変更するとこの変数の値も変わります。データベースの文字セットについては以下を参照して下さい。

character_set_results

サーバからクライアントに返される検索結果などに使用される文字セットです。

character_set_server

サーバの文字セットです。上のcharacter_set_databaseで説明したように、この文字セットは、データベース作成時の暗黙の文字セットとして使用されます。この変数はサーバ起動時のオプションとして初期設定できます。本編では、サーバオプションファイル(my.ini)の[mysqld]セクションで、

default-character-set=utf8

として設定しています。

character_set_system

システムの使用する文字セットで常にutf8が使用されています。

データベースの文字セット

データベースの文字セットはデータベースの作成時に決まります。この場合、暗黙の文字セットはサーバの文字セット(character_set_server)です。これを変更するにはCREATE DATABASE文で明示的に指定します:

CREATE DATABASE test_sjis DEFAULT CHARACTER SET sjis;

データベースの文字セットは、テーブルやカラムの暗黙の文字セットになります。これらの文字セットを変更するには、例えば、以下のようにします。

CREATE TABLE syain_sjis ( ・・・ ) DEFAULT CHARACTER SET sjis;
CREATE TABLE syain_sjis (
  ・・・
  syain_name varchar(50) CHARACTER SET sjis ,
  ・・・
);

文字セットはサーバ、データベース、テーブル、カラムと順に引き継がれます。明示的の指定しない場合は、1つ前のレベルの文字セットが使用されます。



最終更新のRSS Last-modified: Sat, 13 Aug 2005 10:24:32 JST (4479d)