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


MySQL 5.6 リファレンスマニュアル  /  ...  /  一般の文字セットおよび照合順序

10.1.1 一般の文字セットおよび照合順序

文字セットとは、記号とエンコーディングのセットです。照合順序とは、文字セット内の文字を比較するためのルールを集めたものです。架空の文字セットを例にして、文字セットと照合順序の違いを見てみましょう。

ABabの 4 つのアルファベットがあるとします。それぞれの文字に A = 0、B = 1、a = 2、b = 3 の数字を割り当てます。文字Aは記号で、数字 0 はAに対するエンコーディングであり、4 つの文字とそのエンコーディングの組み合わせが文字セットになります。

ABの 2 つの文字列値を比較するとします。これを行うには、Aの 0、Bの 1 というエンコーディングを調べる方法がもっとも簡単です。0 は 1 より小さいので、ABより小さいと見なします。今ここで行なったのは、文字セットに対する照合順序の適用です。照合順序はルールの集まりであり、この場合、ルールはエンコーディングの比較の 1 つだけになります。これは可能な照合順序のうちでもっとも単純なものであり、バイナリ照合順序と呼ばれています。

しかし、小文字と大文字が同等であることを表すにはどうなるのでしょうか。この場合、少なくとも次の 2 つのルールが必要です。(1) 小文字aおよびbAおよびBと同等のものとして扱います。(2) 続いてそのエンコーディングを比較します。これは大文字と小文字を区別しない照合順序と呼ばれます。バイナリ照合順序よりも少し複雑になります。

実際には、ほとんどの文字セットには多数の文字があり、ABだけではなくアルファベット全体が含まれます。複数のアルファベットが含まれる場合も、数千種類の文字や多くの特殊記号および句読点から構成される東洋書記体系の場合もあります。また実際には、ほとんどの照合順序は、大文字と小文字の区別だけでなく、アクセント符号 (アクセント符号とはドイツ語のÖに見られるような文字に付けられた符号です) を区別するかどうかに関するルールや、複数文字のマッピングのルール (2 つのドイツ語の照合順序の一方におけるÖ = OEというルールなど) など多くのルールを含んでいます。

MySQL では以下が可能です。

  • さまざまな文字セットを使用して文字列を格納します。

  • さまざまな照合順序を使用して文字列を比較します。

  • 文字セットまたは照合順序が異なる文字列を、同じサーバー、同じデータベース、または同じテーブル内にも混在させます。

  • どのレベルでも文字セットと照合順序を指定できるようにします。

MySQL はこれらの点において、ほかのほとんどのデータベース管理システムに大きく差をつけています。ただし、これらの機能を効果的に使用するには、利用可能な文字セットと照合順序、各デフォルトの変更方法、および文字列演算子および関数の動作にこれらの機能が与える影響を知っておく必要があります。


User Comments
  Posted by David L Lambert on December 28, 2004
Note that a MySQL database is only one part of a system for storing data that includes extended characters, and your client tools and languages will also need to support the characters you want in your application. For instance, the MySQL comand line client [1] does not allow direct entry of latin-1 characters, let alone Unicode. Furthermore, it doesn't automatically detect the language-environment, so there are some cases where properly entered characters get displayed as soething else; for instance, in US Win95, the command-prompt boxes use CP437, and a lot of printers use that same character set by default.

The MySQL Control Center under MS Windows and Microsoft Access are pretty good about representing international characters faithfully. On RedHat Linux 9, the Control Center displays each non-ASCII character as two boxes (presuably because it internally converts to UTF8, but the X server expects latin1).

JDBC [2] does a good job of handling international characters, because Java uses Unicode internally and the MySQL driver picks the server character set automatically.

Perl supports Unicode internally, thus DBI and CGI [3] would seem like a good set of tools to get at multilingual data. However, DBD::MySQL doesn't actually do any conversion, so in perl 5.6 you might need to do something like

($name) = $dbh->selectrow_array( ... );
$name = pack("U*",unpack("C*",$name));
print "$name\n";

to get the characters in the proper format, or you could add an explicit

$dbh->do("SET character_set_results="utf8"');

before doing anything else.

Note also that CGI.pm (most recent version) sets the output encoding to iso-8859-1 by default, so a CGI script will need to convert back from UTF on output. Unicode::Lite might prove useful in some cases. Perl 5.8 [4] has a slightly different model for handling Unicode that might (untested) require a line similar to the following when the server has been set to respond with Unicode:

use Encode 'decode_utf8';
$name = decode_utf8($name);

References:

1. http://bugs.mysql.com/bug.php?id=7491
2. http://java.sun.com/j2se/1.4.2/docs/api/java/sql/package-summary.html
3. http://search.cpan.org/~lds/CGI.pm-3.05/CGI.pm
4. http://www.perldoc.com/perl5.8.4/pod/perluniintro.html

  Posted by Satanic Puppy on October 2, 2007
I had a data translation issue between a mysql database running remotely and a local instance of Perl and the previous posters suggestion of adding:

$dbh->do("SET character_set_results='utf8'");

to the code cleared it right up. Thanks a bunch; I knew what the problem was, but damned if I could find the solution.
  Posted by Andrey Kovbovich on August 1, 2010
my $dbh = DBI->connect($dsn, $user, $pass, {mysql_enable_utf8 => 1});
  Posted by John Stile on August 18, 2010
I have also seen:
$dbh->prepare("SET NAMES 'utf8'")->execute();

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