10.1.10 Unicode のサポート

Unicode サポートの (MySQL 4.1 での) 初期実装には、Unicode データを格納するための次の 2 つの文字セットが含まれていました。

  • ucs2。文字ごとに 16 ビットを使用する Unicode 文字セットの UCS-2 エンコーディング。

  • utf8。文字ごとに 1 から 3 バイトを使用する Unicode 文字セットの UTF-8 エンコーディング。

これらの 2 つの文字セットは、Unicode バージョン 3.0 の Basic Multilingual Plane (BMP) の文字をサポートします。BMP 文字には次の 3 つの特性があります。

  • これらのコード値は 0 から 65535 (または U+0000 ..U+FFFF) です。

  • これらは、ucs2 と同様に、16 ビット固定の単語でエンコードできます。

  • これらは、utf8 と同様に、8、16、または 24 ビットでエンコードできます。

  • 主要言語のほとんどすべての文字には、これらで十分です。

前述の文字セットではサポートされていない文字には、BMP の範囲外にある補助文字が含まれます。BMP の範囲外の文字は、REPLACEMENT CHARACTER と見なされ、Unicode 文字セットへの変換時に、'?' に変換されます。

MySQL 5.6 での Unicode のサポートには補助文字が含まれるので、範囲がより広いため、より多くのスペースを占める新しい文字セットが必要になります。次の表では、以前の Unicode サポートと現在の Unicode サポートの機能を簡単に比較しています。

MySQL 5.5 より前 MySQL 5.5 以降
すべての Unicode 3.0 文字 すべての Unicode 5.0 および 6.0 文字
補助文字なし 補助文字あり
ucs2 文字セット、BMP のみ 変更なし
3 バイトまでの utf8 文字セット、BMP のみ 変更なし
4 バイトまでの新しい utf8mb4 文字セット、BMP または補助
新しい utf16 文字セット、BMP または補助
新しい utf16le 文字セット、BMP または補助 (5.6.1 以降)
新しい utf32 文字セット、BMP または補助

これらの変更には上位互換性があります。新しい文字セットを使用する場合、アプリケーションの非互換性の問題が生じる可能性があります。セクション10.1.11「以前の Unicode サポートから現在の Unicode サポートへのアップグレード」を参照してください。さらにこのセクションでは、utf8 から (4 バイトの) utf8mb4 文字セットに変換する方法と、そのときに適用される可能性がある制約について説明します。

MySQL 5.6 は、次の Unicode 文字セットをサポートします。

  • ucs2。文字ごとに 16 ビットを使用する Unicode 文字セットの UCS-2 エンコーディング。

  • utf16。Unicode 文字セットの UTF-16 エンコーディング。ucs2 に似ていますが、補助文字用の拡張機能があります。

  • utf16le。Unicode 文字セットの UTF-16LE エンコーディング。utf16 と似ていますが、ビッグエンディアンではなくリトルエンディアンです。

  • utf32。文字ごとに 32 ビットを使用した Unicode 文字セットの UTF-32 エンコーディング。

  • utf8。文字ごとに 1 から 3 バイトを使用する Unicode 文字セットの UTF-8 エンコーディング。

  • utf8mb4。文字ごとに 1 から 4 バイトを使用した Unicode 文字セットの UTF-8 エンコーディング。

ucs2 および utf8 は BMP 文字をサポートします。utf8mb4utf16utf16le、および utf32 は、BMP および補助文字をサポートします。

類似した一連の照合順序を、ほとんどの Unicode 文字セットで使用できます。たとえば、それぞれにはデンマーク語の照合順序があり、その名前は ucs2_danish_ciutf16_danish_ciutf32_danish_ciutf8_danish_ci、および utf8mb4_danish_ci です。例外は utf16le であり、2 つの照合順序しかありません。セクション10.1.14.1「Unicode 文字セット」にはすべての Unicode 照合順序が一覧表示されており、補助文字の照合順序プロパティーについても説明しています。

多くの補助文字は東アジアの言語のものですが、MySQL 5.6 で追加するサポートは、Unicode 文字セットでのより多くの日本語と中国語の文字に対するサポートであり、新しい日本語および中国語の文字セットのサポートではありません。

UCS-2、UTF-16、および UTF-32 の MySQL での実装は、ビッグエンディアンのバイト順で文字を格納し、値の先頭にバイト順マーク (BOM) を使用しません。ほかのデータベースシステムでは、リトルエンディアンのバイト順または BOM を使用していることもあります。このような場合、これらのシステムと MySQL の間でデータを転送するときに、値の変換を実行する必要があります。UTF-16LE の実装はリトルエンディアンです。

MySQL は UTF-8 値に BOM を使用しません。

Unicode を使用したサーバーと通信する必要があるクライアントアプリケーションは、たとえば SET NAMES 'utf8' ステートメントを発行することによって、クライアント文字セットをそれに従って設定する必要があります。ucs2utf16utf16le、および utf32 は、クライアント文字セットとして使用できません。つまり、これらは SET NAMES または SET CHARACTER SET で機能しません。(セクション10.1.4「接続文字セットおよび照合順序」を参照してください。)

以降のセクションでは、MySQL における Unicode 文字セットについてさらに詳しく説明します。


User Comments
  Posted by Haakon Meland Eriksen on January 24, 2006
Connect with the same characterset as your data to display correctly. This example connects to the MySQL-server using UTF-8:

mysql --default-character-set=utf8 -uyour_username -p -h your_databasehost.your_domain.com your_database

If you get into trouble from a PHP-based web application, check the characterset configurations of these components:

1) the MySQL database
2) php.ini
3) httpd.conf
4) your server

  Posted by lorenz pressler on May 2, 2006
if you get data via php from your mysql-db (everything utf-8)
but still get '?' for some special characters in your browser
(<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />),
try this:

after mysql_connect() , and mysql_select_db() add this lines:
mysql_query("SET NAMES utf8");

worked for me.
i tried first with the utf8_encode, but this only worked for äüöéè...
and so on, but not for kyrillic and other chars.
  Posted by Eliram on August 6, 2008
I had a problem submitting unicode data from ASP pages to the MySQL server while everything was set to utf8 .

It turns out the problem was that my ODBC driver was version 3.5.1 and that's what caused the problem. Installing version 5.1 solved the problem.

http://dev.mysql.com/downloads/connector/odbc/
  Posted by David Busby on August 3, 2012
As of mySQL 5.x you can use the init_connect commands to force UTF-8 compliance from any client connection.

I have blogged about this here: http://blog.oneiroi.co.uk/mysql/mysql-forcing-utf-8-compliance-for-all-connections

Removing the need to use SET NAME in your PHP/ASP/Ruby/C++ code.

Sign Up Login You must be logged in to post a comment.