Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  アプリケーションの文字セットおよび照合順序の構成

10.1.5 アプリケーションの文字セットおよび照合順序の構成

デフォルトの MySQL 文字セットおよび照合順序 (latin1latin1_swedish_ci) を使用してデータを格納するアプリケーションの場合、特別な構成は必要ありません。別の文字セットまたは照合順序を使用したデータストレージが必要なアプリケーションの場合は、次の複数の方法で、文字セット情報を構成できます。

  • データベースごとに文字設定を指定します。たとえば、あるデータベースを使用するアプリケーションでは utf8 が必要で、別のデータベースを使用するアプリケーションでは sjis が必要な場合があります。

  • サーバーの起動時に文字設定を指定します。これにより、サーバーは、ほかの調整を行わないすべてのアプリケーションに、所定の設定を使用します。

  • ソースから MySQL を構築する場合は、構成時に文字設定を指定します。これにより、サーバーはすべてのアプリケーションに対して所定の設定を使用し、サーバーの起動時に指定する必要がなくなります。

異なるアプリケーションで別々の文字設定が必要な場合は、データベースごとの手法で十分対応できます。ほとんどまたはすべてのアプリケーションで同じ文字セットを使用する場合は、サーバーの起動時または構成時に文字設定を指定する方法がもっとも便利です。

データベースごとの手法またはサーバー起動の手法では、設定によって、データストレージの文字セットが制御されます。アプリケーションはまた、次の手順で説明するように、クライアントとサーバー間の通信に使用する文字セットをサーバーに知らせる必要もあります。

ここで示す例では、utf8 文字セットと utf8_general_ci 照合順序を使用することを想定しています。

データベースごとに文字設定を指定します。テーブルで所定のデフォルトの文字セットおよび照合順序をデータストレージに使用するようなデータベースを作成するには、次のような CREATE DATABASE ステートメントを使用します。

CREATE DATABASE mydb
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

データベース内に作成されたテーブルは、すべての文字カラムに対してデフォルトで utf8utf8_general_ci を使用します。

データベースを使用するアプリケーションは、接続するたびに、サーバーへの接続を構成する必要もあります。これは、接続後に SET NAMES 'utf8' ステートメントを実行することによって行えます。このステートメントは、接続方法 (mysql クライアント、PHP スクリプトなど) とは無関係に使用できます。

場合によっては、必要な文字セットを別の方法で使用するように接続を構成できます。たとえば、mysql を使用して行われた接続の場合、--default-character-set=utf8 コマンド行オプションを指定すると、SET NAMES 'utf8' と同じ効果を得ることができます。

クライアント接続の構成の詳細は、セクション10.1.4「接続文字セットおよび照合順序」を参照してください。

データベースのデフォルトの文字セットまたは照合順序を変更する場合、データベースのデフォルトを使用するストアドルーチンを削除して、新しいデフォルトを使用するように再作成する必要があります。(ストアドルーチンでは、文字セットまたは照合順序が明示的に指定されていない場合、文字データ型を伴う変数は、データベースのデフォルトを使用します。セクション13.1.15「CREATE PROCEDURE および CREATE FUNCTION 構文」を参照してください。)

サーバーの起動時に文字設定を指定します。サーバーの起動時に文字セットおよび照合順序を選択するには、--character-set-server および --collation-server オプションを使用します。たとえば、オプションファイルでオプションを指定するには、次の行を含めます。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

これらの設定は、サーバー全体に適用され、任意のアプリケーションによって作成されたデータベースのデフォルトおよびこれらのデータベース内に作成されたテーブルのデフォルトとして適用されます。

前述のように、アプリケーションは引き続き、接続したあとで SET NAMES または同等のステートメントを使用して、その接続を構成する必要があります。--init_connect="SET NAMES 'utf8'" オプションでサーバーを起動して、接続するクライアントごとに SET NAMES を自動的に実行させることができます。ただし、SUPER 権限を持つユーザーには init_connect 値は実行されないので、これによって一貫しない結果が生じます。

MySQL の構成時に文字設定を指定します。ソースから MySQL を構成および構築するときに、文字セットおよび照合順序を選択するには、CMakeDEFAULT_CHARSET および DEFAULT_COLLATION オプションを使用します。

shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

この結果構成されたサーバーは、データベースおよびテーブルのデフォルトと、クライアント接続のデフォルトとして、utf8 および utf8_general_ci を使用します。--character-set-server--collation-server を使用して、サーバー起動時にこれらのデフォルトを指定する必要はありません。また、アプリケーションがサーバーに接続したあとで SET NAMES または同等のステートメントを使用して、その接続を構成する必要もありません。

アプリケーション用に MySQL 文字セットを構成する方法とは無関係に、これらのアプリケーションが実行する環境も考慮する必要があります。エディタで作成したファイルから取得された UTF-8 テキストを使用してステートメントを送信する場合、ファイルのエンコーディングが正しく、オペレーティングシステムで正しく処理されるように、環境のロケールを UTF-8 に設定してファイルを編集する必要があります。端末ウィンドウ内から mysql クライアントを使用する場合、UTF-8 を使用するようにこのウィンドウを構成する必要があります。そのようにしないと、文字が正しく表示されない可能性があります。Web 環境で実行するスクリプトの場合、このスクリプトは、MySQL Server とやり取りできるように文字のエンコーディングを正しく処理する必要があり、ページ内容の表示方法をブラウザが認識できるようにエンコーディングを正しく指定したページを生成する必要があります。たとえば、次の <meta> タグを <head> 要素内に含められます。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

User Comments
  Posted by Ilya Cheburaev on April 22, 2009
If you use PHP with mysql you may want to use
in my.ini:
skip-character-set-client-handshake

with

collation_server=utf8_unicode_ci
character_set_server=utf8

it will allow you to use right charset without sending
'set NAMES'
and
'set CHARSET'
with each connection to DB so it will speed up your application
  Posted by time e.less on October 14, 2009
Please add the information about skip-character-set-client-handshake into every page that references server character set and collation.

I'm amazed this startup option is hidden so deep in the documentation, since it seems like many administrators who specify alternate character sets on startup would want the clients to use the server character sets when possible.

  Posted by Gábor Lénárt on October 1, 2010
Wow, skip-character-set-client-handshake saved my day! Old MySQL4.1 setup users had the habit to do "odd" things (having latin2 table but storing utf8 in it, not specifying charset encoding from PHP on the connection etc). I had long hours to solve the problem, since they wanted it to work without extra effort "since it worked before this way" ... Thanks a lot! I think this option should be "advertised" more :) even if it's not the best solution anyway in a clean/new system ...
Sign Up Login You must be logged in to post a comment.