目次

MariaDB10.4 システム変数の参照と変更

phpMyAdmin 4.9.0.1 (MariaDB 10.4.6)

y2sunlight 2019-10-15

MariaDBに戻る

関連記事

以下「MySQL」は「MariaDB」に読み替えて下さい。


概要

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

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


システム変数 version

システム変数versionを参照します。ブラウザからサンプルプログラム(sqlfile.php)を実行します。

http://localhost/mysql/sqlfile.php?f=syaval1.sql
syaval1.sql
SHOW VARIABLES LIKE 'version';
SELECT @@version;

実行結果

システム変数versionはMySQLサーバのバージョンです。本編ではMariaDB 10.1をインストールしているので、この変数は以下のようになります。

10.1.34-MariaDB

システム変数の参照には以下の構文を使用します。

SHOW VARIABLES LIKE '{variable_name}'
SELECT @@{variable_name} 

最初の構文(SHOW VARIABLES)はMySQL独自のもので、次の構文は(select @@)は他のデータベースとの互換性を保持する為にサポートされています。


システム変数 storage_engine

インストールしたMySQLに搭載されているデータベースエンジンを確認してみます。ブラウザからサンプルプログラム(sqlfile.php)を実行します。

http://localhost/mysql/sqlfile.php?f=svinfo1.sql
svinfo1.sql
SHOW ENGINES;

実行結果

実行結果から分かるようにInnoDBがデフォルトエンジンとして使用されています。

次に、システム変数storage_engineを変更してみます。ブラウザからサンプルプログラム(sqlfile.php)を実行します。

http://localhost/mysql/sqlfile.php?f=syaval2.sql
syaval2.sql
SET storage_engine=Aria;
SHOW SESSION VARIABLES LIKE 'storage_engine';
SHOW GLOBAL VARIABLES LIKE 'storage_engine';
SHOW VARIABLES LIKE 'storage_engine';

ここでは、データベースエンジンをデフォルトのInnoDBからAriaに変更します。AriaはMyISAMの耐障害性やキャッシュ機構などを改善した、モダンなデータベースエンジンで、もともとの名前はMariaでした!。

実行結果

システム変数storage_engineはCREATE TABLEで使用されるデフォルトのテーブルタイプです。

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


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

文字セット関連のシステム変数を取得してみます。ブラウザからサンプルプログラム(sqlfile.php)を実行します。

http://localhost/mysql/sqlfile.php?f=syaval3.sql
syaval3.sql
SHOW GLOBAL VARIABLES LIKE 'character_set_%';
SHOW SESSION VARIABLES LIKE 'character_set_%';

実行結果

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

本例では上記実行結果のようになりました。暗黙の文字セットとなるcharacter_set_serverがlatin1になっています。これをutf8に変更するには、my.iniを以下のように変更します。

{XAMPP Install Folder}/mysql/bin/my.ini

my.ini
[mysqld]
character_set_server=utf8

また、上記実行結果では、クライアントとの接続に関係する3つのセッション変数(character_set_client, character_set_results, character_set_connection)はlatin1になっています。latin1はASCIIコードに西ヨーロッパ諸国のアルファベットや記号を追加した8ビット系のコードです。このままの状態では漢字の使用ができません。

漢字を使用するためには、上で説明したようにmy.iniを編集するか、セッションの初めに set names を実行します。

クライアント文字セットをUTF8に設定する

set names utf8;

本サンプルプログラムでは、sオプションを使用することでデータベースセッションの初めに set names を実行できます。

http://localhost/mysql/sqlfile.php?f=syaval3.sql&s=1

set names の実行は上例でもわかるように character_set_client、character_set_connection、character_set_results を設定します。

character_set_client クライアントの使用する文字セットです。サーバへのSQL文はこの文字セットで送信します。
character_set_connection サーバーはクライアントからのSQL文をcharacter_set_clientからcharacter_set_connectionに変換します。
character_set_database デフォルトデータベースの文字セットです。USE文などでデフォルトデータベースを変更するとこの変数の値も変わります。データベースの文字セットについては以下を参照して下さい。
character_set_results サーバからクライアントに返される検索結果などに使用される文字セットです。
character_set_server サーバの文字セットです。この文字セットは、データベース作成時の暗黙の文字セットとして使用されます。この変数は上で説明したように、サーバ起動時(my.ini)のオプションとして初期設定できます。
character_set_system システムの使用する文字セットで常にutf8が使用されています。

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

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

CREATE DATABASE test_utf8 DEFAULT CHARACTER SET utf8;

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

CREATE TABLE syain_utf8 ( ・・・ ) DEFAULT CHARACTER SET utf8;
CREATE TABLE syain_utf8 (
  ・・・
  syain_name VARCHAR(50) CHARACTER SET utf8 ,
  ・・・
);

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