第1章 一般情報

目次

1.1. このマニュアルについて
1.1.1. このマニュアルの表記規則
1.2. MySQL データベース管理システムの概要
1.2.1. MySQL の歴史
1.2.2. MySQL の主な機能
1.2.3. MySQL の安定性
1.2.4. MySQL テーブルの最大サイズ
1.2.5. 西暦 2000 年対応
1.3. MySQL AB の概要
1.3.1. MySQL AB のビジネスモデルとサービス
1.3.2. 問い合わせ先
1.4. MySQL のサポートとライセンス
1.4.1. MySQL AB によって提供されるサポート
1.4.2. MySQL で使用されている著作権とライセンス
1.4.3. MySQL ライセンス
1.4.4. MySQL AB のロゴと商標
1.5. MySQL の開発ロードマップ
1.5.1. MySQL 4.0 の概要
1.5.2. MySQL 4.1 の概要
1.5.3. MySQL 5.0、次期開発リリース
1.6. MySQL の今後(TODO)
1.6.1. 4.1 で計画されている新機能
1.6.2. 5.0 で計画されている新機能
1.6.3. 5.1 で計画されている新機能
1.6.4. 近い将来に計画されている新機能
1.6.5. 中期的な将来に計画されている新機能
1.6.6. 計画されていない新機能
1.7. MySQL の情報源
1.7.1. MySQL メーリングリスト
1.7.2. IRC(インターネットリレーチャット)の MySQL コミュニティサポート
1.8. MySQL の標準への準拠
1.8.1. MySQL が準拠する標準
1.8.2. ANSI モードでの MySQL の実行
1.8.3. SQL-92 標準に対する MySQL 拡張機能
1.8.4. MySQL と SQL-92 との違い
1.8.5. MySQL における制約の処理
1.8.6. MySQL の既知のエラーと設計上の問題

MySQL (R) ソフトウェアによって、非常に高速で堅牢なマルチスレッド形式のマルチユーザ SQLStructured Query Language)データベースサーバが実現します。MySQL サーバは、ミッションクリティカルで負荷が高い運用システムにも、大規模に展開されるソフトウェアへの組み込みにも対応するように設計されています。MySQL は、MySQL AB の商標です。

MySQL ソフトウェアはデュアルライセンス製品です。ユーザは、GNU 一般公衆利用許諾契約書http://www.fsf.org/licenses/)の条件に基づいてオープンソース/フリーソフトウェア製品として MySQL ソフトウェアを使用することも、MySQL AB から標準の商用ライセンスを購入することもできます。 See 項1.4. 「MySQL のサポートとライセンス」

MySQL の Web サイト(http://www.mysql.com/)には、MySQL ソフトウェアに関する最新情報が掲載されています。

このマニュアルで特に興味深いセクションは以下のとおりです。

重要:

エラー(多くの場合、バグと呼ばれます)の報告は、質問やコメントと同様に、通常の MySQL メーリングリストにお送りください。 See 項1.7.1.1. 「MySQL メーリングリスト」。 See 項1.7.1.3. 「バグまたは問題を報告する方法」

Unix では、mysqlbug スクリプトを使用してバグレポートを生成します(Windows ディストリビューションについては、basedir にファイル mysqlbug.txt があります。このファイルをバグレポートのテンプレートとして使用してください)。

ソースディストリビューションについては、mysqlbug スクリプトは scripts ディレクトリにあります。バイナリディストリビューションについては、mysqlbugbin ディレクトリ(MySQL サーバ RPM パッケージの場合は /usr/bin)にあります。

MySQL サーバで重大なセキュリティバグを見つけた場合は、 に電子メールをお送りください。

1.1. このマニュアルについて

これは、MySQL のリファレンスマニュアルです。バージョン 5.0.6-beta の MySQL について記述しています。機能に関する変更は常に、バージョンに言及して説明しています。そのため、古いバージョンの MySQL ソフトウェア(3.23 または 4.0 製品版など)を使用している場合でも、このマニュアルは参考になります。バージョン 5.0(開発版)のリファレンスもあります。

これはリファレンスマニュアルなので、SQL やリレーショナルデータベースの概念に関する一般的な説明は記載していません。

MySQL データベースソフトウェア は継続して開発が行われているので、マニュアルも頻繁に更新されます。このマニュアルの最新版は、http://www.mysql.com/documentation/ から HTML、PDF、Windows HLP 版などのさまざまな形式で入手することができます。

元の文書は Texinfo ファイルです。HTML 版は、変更された texi2html を使用して自動的に生成されます。プレーンテキスト版と Info 版は、makeinfo を使用して生成されます。PostScript 版は、texi2dvidvips を使用して生成されます。PDF 版は、pdftex を使用して生成されます。

マニュアル内で情報を見つけるのが困難な場合は、http://www.mysql.com/doc/ にある検索可能なバージョンを試してみてください。

このマニュアルへの追加や修正に関する提案は、マニュアルチーム(Documentation Team)にお送りください。

このマニュアルは当初、David Axmark と Michael (Monty) Widenius によって執筆されました。現在は、Arjen Lentz、Paul DuBois、および Stefan Hinz で構成される MySQL マニュアルチームによって管理されています。その他多数の貢献者については、付録?C. 協力者 を参照してください。

このマニュアルの著作権(2003-2006)は、スウェーデンの会社 MySQL AB が所有しています。 See 項1.4.2. 「MySQL で使用されている著作権とライセンス」

1.1.1. このマニュアルの表記規則

このマニュアルは、以下の表記規則に従って記載されています。

  • constant

    固定幅フォントは、コマンドの名前やオプション、SQL ステートメント、データベース名、テーブル名、カラム名、C コード、Perl コード、および環境変数に使用する。例:``mysqladmin の動作を確認するには、--help オプションを指定して呼び出す。''

  • filename

    引用符で囲まれた固定幅フォントは、ファイル名およびパス名に使用する。例:``ディストリビューションは、/usr/local/ ディレクトリ下にインストールされる。''

  • c

    引用符で囲まれた固定幅フォントは、文字のシーケンスを示す場合にも使用する。例:``ワイルドカードを指定するには、‘%’ 文字を使用する。''

  • italic

    イタリックフォントは、このように強調する場合に使用する。

  • boldface

    太字フォントは、表の見出しや特に強い強調を表す場合に使用する。

特定のプログラムからコマンドを実行する必要があることを示す場合、コマンドの前にプログラムとプロンプトを記述します。たとえば、shell> はログインシェルから実行するコマンドを示し、mysql>mysql クライアントプログラムから実行するコマンドを示します。

shell> シェルコマンド
mysql> mysql コマンド

``シェル'' はコマンドインタープリタです。Unix では通常、shcsh などのプログラムです。Windows では、Windows コンソールで通常実行される command.comcmd.exe です。

シェルコマンドは、Bourne シェル構文を使用して表します。csh 形式のシェルを使用している場合は、多少異なるコマンドを発行しなければならないことがあります。たとえば、環境変数を設定し、コマンドを実行するシーケンスは、Bourne シェル構文では次のようになります。

shell> VARNAME=value some_command

csh または tcsh の場合は、このシーケンスを次のように実行します。

shell> setenv VARNAME value
shell> some_command

データベース名、テーブル名、およびカラム名は多くの場合、コマンドに代入する必要があります。このような代入が必要であることを示す場合、このマニュアルでは db_nametbl_name、および col_name を使用します。たとえば、次のようなステートメントがあるとします。

mysql> SELECT col_name FROM db_name.tbl_name;

これは、同様のステートメントを入力する場合、データベース名、テーブル名、およびカラム名を自分で指定することを意味します。たとえば、次のようになります。

mysql> SELECT author_name FROM biblio_db.author_list;

SQL キーワードは大文字と小文字を区別しないので、大文字で記述されることも小文字で記述されることもあります。ただし、このマニュアルでは大文字を使用します。

構文の説明で省略可能な単語や節を表す場合、角かっこ(‘[’ および ‘]’)を使用します。たとえば、次のステートメントでは、IF EXISTS は省略可能です。

DROP TABLE [IF EXISTS] tbl_name

構文要素が複数の選択候補で構成される場合、それらの候補を縦線(‘|’)で区切ります。選択候補のいずれかを選択できる場合は、次のように、それらの候補を角かっこ(‘[’ および ‘]’)内に列挙します。

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

選択候補のいずれかを選択しなければならない場合は、次のように、それらの候補を中かっこ(‘{’ および ‘}’)内に列挙します。

{DESCRIBE | DESC} tbl_name {col_name | wild}

1.2. MySQL データベース管理システムの概要

MySQL は最もよく知られているオープンソース SQL データベース管理システムで、MySQL AB によって開発、提供、サポートが行われています。MySQL AB は MySQL の開発者によって創設された営利会社で、MySQL データベース管理システムに関連するサービスを提供することでビジネスを構築しています。 See 項1.3. 「MySQL AB の概要」

MySQL の Web サイト(http://www.mysql.com/)には、MySQL ソフトウェアと MySQL AB に関する最新情報が掲載されています。

  • MySQL はデータベース管理システムである。

    データベースは、構造化されたデータの集合である。データベースには、簡単なショッピングリストから絵画のギャラリー、または社内ネットワークの膨大な量の情報など、さまざまなものがある。コンピュータデータベースに格納されているデータに対して追加、アクセス、および処理などを行うには、MySQL サーバのようなデータベース管理システムが必要となる。コンピュータは大量のデータの処理に非常に優れているので、データベース管理システムは、スタンドアロンのユーティリティまたは他のアプリケーションの一部として、データ処理の中心的な役割を果たす。

  • MySQL はリレーショナルデータベース管理システムである。

    リレーショナルデータベースでは、1 つの大きな保管領域にすべてのデータが格納されるのではなく、個別のテーブルにデータが格納される。これにより、速度と柔軟性が向上する。``MySQL'' の SQL は ``Structured Query Language'' を表す。SQL はデータベースへのアクセスに使用される最も一般的な標準化言語で、ANSI/ISO SQL 標準によって定義されている(SQL 標準は 1986 年以降開発が繰り返され、複数のバージョンがある。このマニュアルでは、``SQL-92'' は 1992 年にリリースされた標準、``SQL-99'' は 1999 年にリリースされた標準、``SQL:2003'' は 2003 年半ばにリリース予定の標準を表す。``SQL 標準'' という用語は、任意の時点における現行バージョンの SQL 標準を表す場合に使用する)。

  • MySQL ソフトウェアはオープンソースである。

    オープンソースとは、だれもがそのソフトウェアを使用し、変更できることを意味する。MySQL ソフトウェアは、だれもが無料でインターネットからダウンロードし、使用することができる。必要に応じて、ソースコードを調べ、ニーズに合わせて変更することができる。MySQL ソフトウェアでは、GPLGNU 一般公衆利用許諾契約書http://www.fsf.org/licenses/))に基づいて、さまざまな状況でのソフトウェアの使用において許可されている事項と禁止されている事項が規定されている。GPL では不都合な場合や商用アプリケーションに MySQL コードを組み込む必要がある場合は、商用ライセンス版を購入することができる。 See 項1.4.3. 「MySQL ライセンス」

  • MySQL データベースサーバを使用するメリット

    MySQL データベースサーバ は、非常に高速で信頼性があり、簡単に使用することができる。それを求めていたのなら、ぜひ試していただきたい。また、MySQL サーバには、ユーザと密接に協力して開発された実用的な機能が備わっている。ベンチマークページで、他のデータベース管理システムと MySQL サーバのパフォーマンスを比較することができる。 See 項5.1.4. 「MySQL ベンチマークスィート」

    MySQL サーバは当初、既存のソリューションよりもはるかに速く大規模なデータベースを処理することを目的として開発され、多くを要求される運用環境で数年間にわたって使用されている。引き続き開発が行われているが、MySQL サーバは現在、便利で多彩な機能を備えている。その接続性、速度、安全性によって、MySQL サーバはインターネット上のデータベースへのアクセスに非常に適している。

  • MySQL サーバの技術的な機能

    詳細な技術情報については、章?6. MySQL SQL言語リファレンス を参照。MySQL データベースソフトウェア は、さまざまなバックエンドをサポートするマルチスレッド形式の SQL サーバ、複数の異なるクライアントプログラムおよびライブラリ、管理ツール、幅広いアプリケーションプログラミングインタフェース(API)から成るクライアント/サーバシステムである。

    また、MySQL サーバはアプリケーションへのリンクが可能なマルチスレッドライブラリとして提供されており、さらに小規模で高速な、管理しやすい製品を作り出すことができる。

  • MySQL をサポートする多数のソフトウェア

    必要なアプリケーションや言語ですでに MySQL データベースサーバがサポートされていると思われる。

MySQL の正式な発音は ``My Ess Que Ell'' ですが(``my sequel'' ではありません)、``my sequel'' と発音したり、ローカライズされた他の方法で発音してもかまいません。

1.2.1. MySQL の歴史

当初は、高速で低レベルな独自の(ISAM)ルーチンを使用してテーブルに接続するために mSQL を使用するつもりでした。しかし、いくつかのテストを行った結果、mSQL はそれほど高速でも柔軟でもないため、ニーズに合わないという結論に至りました。これが要因となって、私たちのデータベースへの新しい SQL インタフェースを開発することになりました。ただし、mSQL とほとんど同じ API インタフェースを使用することにしました。この API を選択したのは、mSQL で使用するために記述されたサードパーティのコードを MySQL で使用するために簡単に移植できるようにするためです。

MySQL という名前の由来は明らかではありません。当社の基本ディレクトリおよび多数のライブラリやツールには、10 年以上にわたって ``my'' というプリフィックスが使われています。また、共同創設者 Monty Widenius の娘の名前も My です。そのため、このうちのどちらが MySQL の名前の由来となったのかは、私たちにとってもいまだに謎なのです。

MySQL のイルカ(当社のロゴ)の名前は Sakila です。Sakila は、当社の「イルカのネーミング」コンテストで、ユーザによって提案された膨大な数の名前の中から MySQL AB の創設者が選んだものです。この名前を提案したのは、アフリカのスワジランド出身の Ambrose Twebaze というオープンソースソフトウェアの開発者でした。Ambrose によると、Sakila という名前は、スワジランドの現地語であるシスワティ語にルーツがあるということです。また、Sakila は、Ambrose の出生国であるウガンダに近い、タンザニアのアルーシャにある町の名前でもあります。

1.2.2. MySQL の主な機能

MySQL データベースソフトウェア の重要な特徴の一部を以下で説明します。 See 項1.5.1. 「MySQL 4.0 の概要」

  • 内部および移植性

    • C および C++ で記述されている。

    • さまざまなコンパイラでテストされている。

    • さまざまなプラットフォームで動作する。 See 項2.2.3. 「MySQL がサポートしているオペレーティングシステム」

    • 移植性のために GNU Automake、Autoconf、および Libtool を使用している。

    • C、C++、Eiffel、Java、Perl、PHP、Python、Ruby、および Tcl の API が使用可能である。 See 章?11. MySQL API

    • カーネルスレッドを使用した完全なマルチスレッド。そのため、使用可能な場合、複数の CPU を簡単に使用することができる。

    • トランザクションストレージエンジンと非トランザクションストレージエンジンを備えている。

    • インデックス圧縮を備えた非常に高速な B-tree ディスクテーブル(MyISAM)を使用している。

    • 別のストレージエンジンの追加が比較的容易である。これは、社内データベースへの SQL インタフェースを追加する場合に便利である。

    • スレッドベースの非常に高速なメモリ割り当てシステム。

    • 最適化された one-sweep multi-join を使用した非常に迅速な結合。

    • テンポラリテーブルとして使用されるメモリ内ハッシュテーブル。

    • 高度に最適化されたクラスライブラリから SQL 関数が実装されるため、最大限の速度が確保される。通常は、クエリの初期化後にメモリ割り当てが行われることはない。

    • MySQL コードは Purify(市販のメモリリーク検出システム)と Valgrind と呼ばれる GPL ツール(http://developer.kde.org/~sewardj/)を使用してテストされている。

    • クライアント/サーバまたは組み込み(リンク)バージョンとして使用可能である。

  • カラム型

    • 多数のカラム型: 1、2、3、4、および 8 バイト長の符号付き/符号なし整数、FLOATDOUBLECHARVARCHARTEXTBLOBDATETIMEDATETIMETIMESTAMPYEARSET、および ENUM 型。 See 項6.2. 「カラム型」

    • 固定長および可変長のレコード。

  • コマンドと関数

    • クエリの SELECT 節および WHERE 節での演算子と関数の完全なサポート。たとえば、次のように使用することができる。

      mysql> SELECT CONCAT(first_name, " ", last_name)
          -> FROM tbl_name
          -> WHERE income/dependents > 10000 AND age > 30;
      
    • SQL の GROUP BY 節および ORDER BY 節の完全なサポート。グループ関数(COUNT()COUNT(DISTINCT ...)AVG()STD()SUM()MAX()MIN()、および GROUP_CONCAT())のサポート。

    • 標準の SQL 構文および ODBC 構文での LEFT OUTER JOIN および RIGHT OUTER JOIN のサポート。

    • SQL-92 で必要な、テーブルおよびカラムにおけるエイリアスのサポート。

    • DELETEINSERTREPLACE、および UPDATE は、変更された(影響を受けた)レコードの数を返す。サーバに接続する際にフラグを設定することで、代わりに一致したレコードの数を返すことも可能である。

    • MySQL 固有の SHOW コマンドを使用すると、データベース、テーブル、およびインデックスに関する情報を取得することができる。EXPLAIN コマンドを使用すると、オプティマイザによるクエリの解決方法を決定することができる。

    • 関数名は、テーブル名やカラム名と衝突しない。たとえば、ABS は有効なカラム名である。関数呼び出しで、関数名とその後に続く ‘(’ との間にスペースを使用できない点が唯一の制限事項である。 See 項6.1.7. 「MySQL での予約語の扱い」

    • 同一のクエリにさまざまなデータベース内のテーブルを混在させることができる(バージョン 3.22 以降)。

  • セキュリティ

    • 非常に柔軟で安全な特権およびパスワードシステム。ホストベースの検証が可能である。サーバに接続する際にすべてのパスワードトラフィックが暗号化されるので、パスワードは安全である。

  • 拡張性と範囲

    • 大規模なデータベースを処理する。当社は、MySQL サーバを使用して 50,000,000 レコードが格納されたデータベースを処理している。また、MySQL サーバを使用して 60,000 テーブル、約 5,000,000,000 レコードを処理しているユーザもいる。

    • 各テーブルで最高 32 個のインデックスが使用可能である。各インデックスは、1 から 16 個のカラムまたはカラムの一部で構成される。インデックスの最大幅は 500 バイトである(これは、MySQL サーバのコンパイル時に変更可能である)。インデックスでは、CHAR 型または VARCHAR 型のカラムのプリフィックスを使用することができる。

  • 接続性

    • クライアントは、あらゆるプラットフォームで TCP/IP ソケットを使用して MySQL サーバに接続することができる。NT ファミリ(NT、2000、または XP) の Windows システムでは、クライアントは名前付きパイプを使用して接続することができる。Unix システムでは、Unix ドメインソケットファイルを使用して接続することができる。

    • Connector/ODBC インタフェースによって、ODBC(Open-DataBase-Connectivity)接続を使用するクライアントプログラムに MySQL サポートが提供される。たとえば、MS Access を使用して MySQL サーバに接続することができる。クライアントは、Windows と Unix のどちらで実行されていてもかまわない。Connector/ODBC ソースが使用可能である。他の多くの機能と同様に、ODBC 2.5 のすべての機能がサポートされる。 See 項11.2. 「MySQL の ODBC サポート」

  • ローカライズ

    • サーバからクライアントへ多数の言語でエラーメッセージを送信することができる。 See 項4.7.2. 「英語以外のエラーメッセージ」

    • ISO-8859-1(Latin1)、german、big5、ujis などのさまざまなキャラクタセットの完全なサポート。たとえば、スカンジナビア語の文字 ‘a’、‘a’、および ‘o’ をテーブル名やカラム名で使用することができる。

    • すべてのデータが、選択したキャラクタセットで保存される。通常の文字列カラムの比較はすべて、大文字と小文字を区別しない。

    • ソートは、選択したキャラクタセットに基づいて行われる(デフォルトはスウェーデン語によるソート)。これは、MySQL サーバの起動時に変更することができる。非常に高度なソートの例については、チェコ語のソートコードを参照。MySQL サーバではさまざまなキャラクタセットがサポートされており、コンパイル時および実行時に指定することができる。

  • クライアントとツール

    • MySQL サーバには、テーブルのチェック、最適化、および修復を行う SQL ステートメントのサポートが組み込まれている。これらのステートメントは、mysqlcheck クライアントを介してコマンドラインから使用可能である。また、MySQL には、MyISAM テーブルでこれらの操作を実行するための myisamchk という非常に高速なコマンドラインユーティリティが組み込まれている。 See 章?4. データベース管理

    • --help または -? オプションを指定して呼び出すと、すべての MySQL プログラムでオンラインヘルプを参照することができる。

1.2.3. MySQL の安定性

このセクションでは、``MySQL サーバの安定性'' と ``プロジェクトにおける MySQL サーバの信頼性'' という問題を扱います。これらの問題を明らかにし、多数の潜在ユーザに関連する重要な質問に答えます。このセクションに記載されている情報は、問題の特定や使用方法の報告が非常に活発に行われているメーリングリストから収集したデータに基づいています。

元のコードは 1980 年代初期に記述されたもので、安定したコードベースとなっています。また、ISAM テーブル形式には下位互換性が維持されています。MySQL AB の前身である TcX では、1996 年半ば以来、MySQL コードはプロジェクトで問題なく動作していました。MySQL データベースソフトウェア がより広く一般にリリースされるとすぐに、新しいユーザが ``テストされていないコード'' をいくつか見つけました。それ以降の新しいリリースごとに、移植性に関する問題は少なくなっています(また一方では、新しいリリースごとに多数の新機能が追加されています)。

MySQL サーバの各リリースは常に実用的です。問題が発生するのは、ユーザが ``グレーゾーン'' のコードを使用しようとしたときだけです。もっとも、新しいユーザはグレーゾーンとは何かを知りません。そのため、このセクションでは、現時点で認識されているその領域を説明します。説明は主に、MySQL サーバのバージョン 3.23 および 4.0 を対象とします。最新バージョンでは、バグセクションに記載されている設計関連のバグを除き、報告されている既知のバグはすべて修正されています。 See 項1.8.6. 「MySQL の既知のエラーと設計上の問題」

MySQL サーバは、複数層の独立したモジュールで構成されています。新しいモジュールの一部とそれらのテストステータスを以下に示します。

  • レプリケーション --- ガンマ

    レプリケーションによる大規模なサーバグループが運用されており、良好な結果を得ている。MySQL 4.x では、拡張されたレプリケーション機能に対する取り組みが引き続き行われている。

  • InnoDB テーブル --- 安定(3.23.49 以降の 3.23)

    InnoDB トランザクションストレージエンジンは、MySQL 3.23 ツリーのバージョン 3.23.49 以降で安定していると宣言されている。InnoDB は、大規模で負荷が高い運用システムで使用されている。

  • BDB テーブル --- ガンマ

    Berkeley DB コードは非常に安定しているが、MySQL サーバでは引き続き BDB トランザクションストレージエンジンインタフェースの改良を行っている。そのため、他のテーブル型のように十分にテストされるにはしばらく時間が必要である。

  • 全文検索 --- ベータ

    全文検索は動作するが、まだ広範には使用されていない。MySQL 4.0 には、重要な拡張機能が実装されている。

  • MyODBC 3.51 (ODBC SDK 3.51 を使用) --- 安定

    広く運用されている。ODBC ドライバや基盤となっているデータベースサーバとは無関係の、アプリケーションに関連していると思われる問題が発生している。

  • MyISAM テーブルの自動リカバリ --- ガンマ

    このステータスは、MyISAM ストレージエンジンの新しいコードのみに該当する。このコードでは、テーブルを開く際に、前にそのテーブルが正しく閉じられたかどうかがチェックされ、正しく閉じられていない場合はテーブルの自動チェック/修復が実行される。

  • 一括挿入 --- アルファ

    多数のレコードをより速く挿入するための MySQL 4.0 における MyISAM テーブルの新機能である。

  • ロック --- ガンマ

    これはシステム依存である。一部のシステムでは、オペレーティングシステム標準のロック(fcntl())を使用することに大きな問題がある。このような場合、--skip-external-locking フラグを指定して mysqld を実行する必要がある。問題は、一部の Linux システムと、NFS によってマウントされたファイルシステム使用時の SunOS で発生することが確認されている。

MySQL AB では、高品質のサポートを有料でお客様に提供しております。また、だれもが質問することができるコミュニティリソースとして MySQL メーリングリストを提供しております。

バグは通常、パッチによって至急修正されます。重大なバグについては、ほとんどの場合、新しいリリースが提供されます。

1.2.4. MySQL テーブルの最大サイズ

MySQL バージョン 3.22 では、テーブルのサイズは 4 GB(4 ギガバイト)に制限されていました。MySQL バージョン 3.23 の MyISAM テーブル型では、テーブルの最大サイズが 800万テラバイト(2^63 バイト)に増えました。有効なテーブルのサイズがこのように大きくなったことで、現在では、MySQL データベースに効果的なテーブルの最大サイズは通常、MySQL 内部の制限ではなく、オペレーティングシステムのファイルサイズに関する制限によって決まります。

次の表は、オペレーティングシステムのファイルサイズに関する制限の例を示しています。

オペレーティングシステムファイルサイズの制限
Linux-Intel 32-bit2 GB、LFS 使用の場合はそれ以上
Linux-Alpha8 TB(?)
Solaris 2.5.12 GB(パッチにより 4GB まで可)
Solaris 2.64 GB(フラグにより変更可能)
Solaris 2.7 Intel4 GB
Solaris 2.7 UltraSPARC512 GB

Linux 2.2 では、ext2 ファイルシステム用の LFS パッチを使用することで、2 GB より大きいサイズのテーブルを使用することができます。また、Linux 2.4 には ReiserFS および ext3 が組み込まれており、これらを使用することで大きいファイルがサポートされます。現在の Linux ディストリビューションのほとんどはカーネル 2.4 に基づいており、必要な Large File Support(LFS)パッチすべてがすでに組み込まれています。しかし、それでも、有効な最大ファイルサイズはいくつかの要因によって左右されます。そのうちの 1 つが、MySQL テーブルを格納するために使用されるファイルシステムです。

Linux における LFS の詳細については、Andreas Jaeger の「Large File Support in Linux」(http://www.suse.de/~aj/linux_lfs.html)を参照してください。

デフォルトでは、MySQL では有効な最大サイズが約 4 GB の内部構造を持つ MyISAM テーブルが作成されます。SHOW TABLE STATUS コマンドまたは myisamchk -dv table_name を使用して、テーブルの最大サイズをチェックすることができます。 See 項4.6.8. 「SHOW 構文」

4 GB より大きいサイズのテーブルが必要な場合(オペレーティングシステムで大規模ファイルがサポートされていれば)、CREATE TABLE ステートメントで AVG_ROW_LENGTH および MAX_ROWS オプションを指定することができます。4 GB を超えるテーブルを作成するには、これらのオプションを使用してください。See 項6.5.3. 「CREATE TABLE 構文」。また、ALTER TABLE を使用して、後でこれらのオプションを設定することもできます。 See 項6.5.4. 「ALTER TABLE 構文」

MyISAM テーブルのファイルサイズに関する制限に対処する方法として、他に次のような方法があります。

  • 読み込み専用の大規模テーブルの場合、myisampack を使用してテーブルを圧縮することができる。myisampack では通常、テーブルが少なくとも 50% 圧縮されるので、結果的にはるかに大きいテーブルを使用することが可能である。また、myisampack を使用して、複数のテーブルを 1 つのテーブルにマージすることもできる。 See 項4.8.4. 「myisampack(MySQL 圧縮読み取り専用テーブルジェネレータ)」

  • また、MyISAM データファイルに関するオペレーティングシステムのファイル制限に対処する方法として、RAID オプションを使用することもできる。 See 項6.5.3. 「CREATE TABLE 構文」

  • MySQL に組み込まれている MERGE ライブラリを使用して、同一のテーブルの集合を 1 つのテーブルとして処理することもできる。See 項7.2. 「MERGE テーブル」

1.2.5. 西暦 2000 年対応

MySQL サーバ自体は、西暦 2000 年(Y2K)対応に関しては何の問題もありません。

  • MySQL サーバでは、TIMESTAMP 値については日付を 2037 年に処理する Unix 時間関数を使用する。DATE 値および DATETIME 値については、9999 年までの日付が使用可能である。

  • MySQL 日付関数すべてが 1 つのファイル sql/time.cc に格納され、西暦 2000 年に対応するように非常に慎重にコード化されている。

  • MySQL バージョン 3.22 以降では、YEAR 型のカラムに 0 年および 1901 年から 2155 年までの年を 1 バイトで格納し、2 桁または 4 桁で表示することができる。2 桁の年はすべて、1970 年から 2069 年までの範囲にあると見なされる。つまり、YEAR 型のカラムに 01 を格納した場合、MySQL サーバでは 2001 として処理される。

次の簡単な例で、MySQL サーバに 2030 年までの日付に関する問題がないことを示します。

mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE y2k (date DATE,
    ->                   date_time DATETIME,
    ->                   time_stamp TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO y2k VALUES
    -> ("1998-12-31","1998-12-31 23:59:59",19981231235959),
    -> ("1999-01-01","1999-01-01 00:00:00",19990101000000),
    -> ("1999-09-09","1999-09-09 23:59:59",19990909235959),
    -> ("2000-01-01","2000-01-01 00:00:00",20000101000000),
    -> ("2000-02-28","2000-02-28 00:00:00",20000228000000),
    -> ("2000-02-29","2000-02-29 00:00:00",20000229000000),
    -> ("2000-03-01","2000-03-01 00:00:00",20000301000000),
    -> ("2000-12-31","2000-12-31 23:59:59",20001231235959),
    -> ("2001-01-01","2001-01-01 00:00:00",20010101000000),
    -> ("2004-12-31","2004-12-31 23:59:59",20041231235959),
    -> ("2005-01-01","2005-01-01 00:00:00",20050101000000),
    -> ("2030-01-01","2030-01-01 00:00:00",20300101000000),
    -> ("2050-01-01","2050-01-01 00:00:00",20500101000000);
Query OK, 13 rows affected (0.01 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM y2k;
+------------+---------------------+----------------+
| date       | date_time           | time_stamp     |
+------------+---------------------+----------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+
13 rows in set (0.00 sec)

TIMESTAMP 型のカラムの最後の値がゼロになっているのは、最後の年(2050)が TIMESTAMP の上限を超えているためです。TIMESTAMP データ型は現在の時刻を格納するために使用され、32 ビットマシンでは 19700101000000 から 20300101000000 までの値(符号付きの値)をサポートします。64 ビットマシンでは、2106 までの値(符号なしの値)を処理します。

この例は、DATE および DATETIME データ型にも日付の使用に関する問題がないことを示しています。これらのデータ型では、9999 年までの日付が処理されます。

MySQL サーバ自体は Y2K に対応していますが、Y2K に対応していないアプリケーションとともに使用すると、問題が発生することがあります。たとえば、多くの古いアプリケーションでは、4 桁の値ではなく、あいまいな 2 桁の値を使用して年の格納や処理が行われます。この問題は、値が ``ない'' ことを示す場合に 0099 などの値を使用するアプリケーションでは、さらに複雑になる可能性があります。それぞれのアプリケーションはさまざまなプログラマによって記述されており、プログラマごとに異なる規則や日付処理関数を使用している可能性があるので、これらの問題を修正するのは困難な場合があります。

そのため、MySQL サーバに Y2K 問題がなくても、アプリケーションとしてあいまいでない情報を提供することが必要です。年を表す 2 桁の値を含むあいまいな日付入力データの処理に関する MySQL サーバのルールについては、項6.2.2.1. 「西暦 2000 年問題と日付型」 を参照してください。

1.3. MySQL AB の概要

MySQL ABMySQL の創始者と主な開発者の会社で、最初は David Axmark、Allan Larsson、および Michael ``Monty'' Widenius によってスウェーデンに創設されました。

MySQL サーバの開発者はすべて、当社の従業員です。当社は、世界中の多数の国の人々から成るバーチャルな組織です。毎日ネットを使って相互に、またはユーザ、サポータ、およびパートナと広くコミュニケーションを図っています。

当社は、MySQL ソフトウェアの開発と新しいユーザへの当社のデータベースの普及に専念しております。MySQL AB は、MySQL のソースコード、MySQL のロゴと商標、およびこのマニュアルの著作権を所有しています。 See 項1.2. 「MySQL データベース管理システムの概要」

MySQL の本質的価値が、MySQL およびオープンソースへの当社の献身を示しています。

当社は、MySQL データベースソフトウェア が次のようなものであることを願っています。

  • 世界中で最も広く使用される、世界最高のデータベースである。

  • だれもが入手でき、価格が手ごろである。

  • 使いやすい。

  • 速度と安全性を確保しながら、改良を続ける。

  • 楽しく使用および改良することができる。

  • バグがない。

MySQL ABMySQL AB の従業員は、以下のことを心がけています。

  • オープンソースの理念を推進し、オープンソースコミュニティをサポートする。

  • 健全なメンバーである。

  • 当社の価値観と考え方を共有するパートナを優先する。

  • 電子メールに回答し、サポートを提供する。

  • 他者とネットワークで結ばれたバーチャルな企業である。

  • ソフトウェアの特許権に反対する立場をとる。

MySQL の Web サイト(http://www.mysql.com/)には、MySQLMySQL AB に関する最新情報が掲載されています。

会社名の ``AB'' の部分は、スウェーデン語の ``aktiebolag''、つまり ``株式会社'' の頭字語です。したがって、``MySQL 株式会社'' という意味です。実際、MySQL AB の子会社として、MySQL Inc. や MySQL GmbH などがあります。これらの子会社はそれぞれ、アメリカとドイツにあります。

1.3.1. MySQL AB のビジネスモデルとサービス

当社に最もよく寄せられる質問の 1 つが ``製品を無償で提供してどのように採算をとっているのですか?'' というものです。これに対する回答は次のとおりです。

MySQL AB は、サポート、サービス、商用ライセンス、およびロイヤルティで利益を上げています。当社では、これらの収益を製品開発や MySQL ビジネスの拡大に充てています。

当社は、創設以来、常に利益を上げています。2001 年 10 月には、代表的な北欧の投資家と何人かの資金援助者から事業投資を受けました。この投資は、当社のビジネスモデルを固め、継続的な成長の基盤を確立するために使われています。

1.3.1.1. サポート

MySQL AB は、MySQL データベースの創始者と主な開発者が所有し、経営しています。開発者は、お客様やその他のユーザのニーズや問題を常に把握しておくために、サポートの提供に取り組んでいます。当社のサポートはすべて、経験豊富な開発者によって提供されます。実際、難しい質問には、MySQL サーバの最も重要な作成者である Michael Monty Widenius が回答します。 See 項1.4.1. 「MySQL AB によって提供されるサポート」

詳細とさまざまなレベルのサポートの申し込みについては、http://www.mysql.com/support/ を参照するか、当社の販売スタッフ()にお問い合わせください。

1.3.1.2. トレーニングと検定

MySQL AB は、MySQL 関連のトレーニングを世界中で実施しています。当社では、オープンコースと企業固有のニーズに合わせた社内トレーニング用コースの両方を用意しております。また、当社のパートナである MySQL 認定トレーニングセンターによる MySQL トレーニングもあります。

当社のトレーニング教材には、当社のマニュアルで使用されているものと同じサンプルデータベースやサンプルアプリケーションが使用されています。また、教材は最新版の MySQL を反映するように常に更新されています。さらに、当社の講師は開発チームによってサポートされているため、トレーニングの質とコース教材の継続的な開発を保証いたします。また、トレーニング中に発生した質問には必ずお答えします。

トレーニングコースに参加することで、MySQL アプリケーションの目標を達成することができます。さらに、以下のことを実現することができます。

  • 時間を節約する。

  • アプリケーションのパフォーマンスを向上させる。

  • 余分なハードウェアの必要性を低減または排除して、コストを削減する。

  • セキュリティを強化する。

  • 顧客および同僚の満足度を向上させる。

  • MySQL 検定の準備をする。

受講者として、またはトレーニングパートナとして当社のトレーニングに関心をお持ちの方は、トレーニングセクション(http://www.mysql.com/training/)を参照するか、当社()にお問い合わせください。

MySQL 検定プログラムの詳細については、http://www.mysql.com/certification/ を参照してください。

1.3.1.3. コンサルティング

MySQL AB とその認定パートナは、世界中の MySQL サーバユーザおよび独自のソフトウェアに MySQL サーバを組み込むユーザにコンサルティングサービスを提供しています。

当社のコンサルタントは、データベースの設計と調整、効率的なクエリの作成、最適なパフォーマンスを確保するためのプラットフォームの調整、移行に関する問題の解決、レプリケーションの設定、堅牢なトランザクションアプリケーションの構築などをお手伝いします。また、大規模展開を目的として、独自の製品やアプリケーションに MySQL サーバを組み込むお客様のお手伝いもいたします。

当社のコンサルタントは、開発チームと密接に協力しています。そのため、専門的なサービスの技術的な品質を保証いたします。コンサルティングは、2 日間のパワースタートセッションから、何週間、何か月にもわたるプロジェクトまでさまざまです。当社の専門家は、MySQL サーバだけを扱うわけではありません。PHP や Perl などのプログラミング言語およびスクリプト言語についても対応します。

コンサルティングサービスおよびコンサルティングパートナに関心をお持ちの方は、当社の Web サイトのコンサルティングセクション(http://www.mysql.com/consulting/)を参照するか、コンサルティングスタッフ()にお問い合わせください。

1.3.1.4. 商用ライセンス

MySQL データベースは、GNU 一般公衆利用許諾契約書GPL)に基づいてリリースされています。つまり、MySQL ソフトウェアは、GPL の下、無償で使用することができます。ただし、GPL の条件(アプリケーションも GPL に基づいていなければならないという要件など)に拘束されたくない場合は、MySQL AB から同じ製品の商用ライセンスを購入することができます。http://www.mysql.com/products/pricing.html を参照してください。MySQL ABMySQL のソースコードの著作権を所有しているので、デュアルライセンスを採用して、GPL および商用ライセンスの下で同じ製品を提供することができます。これにより、オープンソースへの MySQL AB の取り組みに影響が生じることはありません。商用ライセンスが必要な場合の詳細については、項1.4.3. 「MySQL ライセンス」 を参照してください。

当社は、MySQL サーバに価値を追加するサードパーティのオープンソース GPL ソフトウェアの商用ライセンスも販売しております。わかりやすい例として、ACID サポート、行レベルのロック、クラッシュリカバリ、マルチバージョニング、外部キーサポートなどを提供する InnoDB トランザクションストレージエンジンがあります。 See 項7.5. 「InnoDB テーブル」

1.3.1.5. パートナ提携

MySQL AB には、トレーニングコース、コンサルティングとサポート、出版、MySQL および関連製品の再販と提供を扱う世界的なパートナプログラムがあります。MySQL AB パートナは Web サイト(http://www.mysql.com/)で公開されるとともに、個々の製品を区別し、ビジネスを促進するために特殊なバージョンの MySQL の商標を使用する権利を得られます。

MySQL AB パートナに関心をお持ちの方は、 に電子メールをお送りください。

MySQL という言葉と MySQL のイルカのロゴは、MySQL AB の商標です。See 項1.4.4. 「MySQL AB のロゴと商標」。これらの商標は、MySQL の創始者が何年にもわたって築いてきた意義深い価値を表しています。

MySQL の Web サイト(http://www.mysql.com/)は、開発者やユーザによく知られています。2001 年 10 月には、1,000 万回のページアクセスがありました。当社の Web サイトへの訪問者は、ソフトウェアとハードウェアの両方について購入の決定と推奨を行うグループです。訪問者の 12% が正式に購入を決定し、購入の決定にまったく関連しないのはわずか 9% です。65% を超える訪問者が過去半年以内に 1 件以上のオンライン取り引きを行ったことがあり、70% の訪問者はその後数か月内に取り引きを予定しています。

1.3.2. 問い合わせ先

MySQL の Web サイト(http://www.mysql.com/)には、MySQLMySQL AB に関する最新情報が掲載されています。

当社のニュースリリース(http://www.mysql.com/news/)に掲載されていないプレス関連のサービスや質問については、 に電子メールをお送りください。

MySQL AB と有効なサポート契約を結んでいる方は、MySQL ソフトウェアに関する技術的な質問に対する明確な回答をタイムリーに得ることができます。詳細については、項1.4.1. 「MySQL AB によって提供されるサポート」 を参照してください。または、Web サイトの http://www.mysql.com/support/ を参照するか、 に電子メールをお送りください。

MySQL トレーニングについては、トレーニングセクション(http://www.mysql.com/training/)を参照してください。インターネットにアクセスできない場合は、MySQL AB のトレーニングスタッフ()に電子メールでお問い合わせください。 See 項1.3.1.2. 「トレーニングと検定」

MySQL 検定プログラムについては、http://www.mysql.com/certification/ を参照してください。 See 項1.3.1.2. 「トレーニングと検定」

コンサルティングに関心をお持ちの方は、Web サイトのコンサルティングセクション(http://www.mysql.com/consulting/)を参照してください。インターネットにアクセスできない場合は、MySQL AB のコンサルティングスタッフ()に電子メールでお問い合わせください。 See 項1.3.1.3. 「コンサルティング」

https://order.mysql.com/ では、商用ライセンスをオンラインで購入することができます。また、MySQL AB に FAX で購入申込書を送信する方法を参照することもできます。ライセンスの詳細については、http://www.mysql.com/products/pricing.html を参照してください。ライセンスに関する質問がある場合やハイボリュームライセンス契約の見積もりが必要な場合は、Web サイト(http://www.mysql.com/)にある問い合わせ用紙に記入するか、(ライセンスに関する質問)または (販売見積もり)に電子メールをお送りください。 See 項1.4.3. 「MySQL ライセンス」

MySQL AB とのパートナ提携に関心をお持ちの企業は、 に電子メールをお送りください。 See 項1.3.1.5. 「パートナ提携」

MySQL の商標ポリシーの詳細については、http://www.mysql.com/company/trademark.html を参照するか、 に電子メールをお送りください。 See 項1.4.4. 「MySQL AB のロゴと商標」

採用セクション(http://www.mysql.com/company/jobs/)に掲載されている MySQL AB の職種に関心をお持ちの方は、 に電子メールをお送りください。履歴書は、添付ファイルとして送信するのではなく、電子メールメッセージの最後にプレーンテキスト形式で記載してください。

多数のユーザ間の一般的なディスカッションについては、該当するメーリングリストを参照してください。 See 項1.7.1. 「MySQL メーリングリスト」

エラー(多くの場合、バグと呼ばれます)の報告は、質問やコメントと同様に、通常の MySQL メーリングリストにお送りください。See 項1.7.1.1. 「MySQL メーリングリスト」MySQL サーバで重大なセキュリティバグを見つけた場合は、 に電子メールをお送りください。 See 項1.7.1.3. 「バグまたは問題を報告する方法」

公開可能なベンチマーク結果をお持ちの方は、 に電子メールでお問い合わせください。

このマニュアルへの追加や修正に関する提案については、マニュアルチーム(Documentation Team)に電子メールをお送りください。

MySQL の Web サイト(http://www.mysql.com/)の運営や内容に関する質問やコメントについては、 に電子メールをお送りください。

MySQL AB にはプライバシーポリシーがあります。http://www.mysql.com/company/privacy.html を参照してください。このポリシーに関する質問については、 に電子メールをお送りください。

その他の質問についてはすべて、 に電子メールをお送りください。

1.4. MySQL のサポートとライセンス

このセクションでは、MySQL のサポートおよびライセンスに関する取り決めについて説明します。

1.4.1. MySQL AB によって提供されるサポート

MySQL AB からのテクニカルサポートでは、MySQL データベースエンジンをコード化するソフトウェアエンジニアからお客様個々の問題に応じた回答が提供されます。

当社は、テクニカルサポートを広く、包括的にとらえます。お客様にとって重要な MySQL ソフトウェアに関するほとんどの問題は、当社にとっても重要です。ユーザは通常、さまざまなコマンドやユーティリティを使用する方法、パフォーマンスボトルネックを除去する方法、クラッシュしたシステムをリストアする方法、MySQL に対するオペレーティングシステムやネットワークの影響を理解する方法、バックアップおよびリカバリに関するベストプラクティスを設定する方法、API を利用する方法などについてのヘルプを必要としています。当社のサポートは、できる限りのお手伝いをすることを心がけていますが、MySQL サーバと独自のユーティリティのみを対象とし、MySQL サーバにアクセスするサードパーティ製品は対象としておりません。

さまざまなサポートオプションの詳細については、http://www.mysql.com/support/ を参照してください。ここでは、サポート契約をオンラインで申し込むこともできます。インターネットにアクセスできない場合は、販売スタッフ()に電子メールでお問い合わせください。

テクニカルサポートは生命保険のようなものです。生命保険がなくても何年間も快適に暮らせますが、そのときがくれば、非常に重要になります。しかし、それから保険に入ったのでは遅すぎるのです。重要なアプリケーションに MySQL サーバを使用している場合、問題が突然発生したときに、自分だけですべてを解決するのは非常に時間がかかります。そのような場合、MySQL AB で採用している経験豊富な MySQL のトラブルシューティング担当者への直接のアクセスが必要になることがあります。

1.4.2. MySQL で使用されている著作権とライセンス

MySQL AB は、MySQL のソースコード、MySQL のロゴと商標、およびこのマニュアルの著作権を所有しています。See 項1.3. 「MySQL AB の概要」MySQL ディストリビューションには、さまざまなライセンスが関連しています。

  1. サーバ、mysqlclient ライブラリ、クライアント、および GNU readline ライブラリ内の MySQL 固有のソースはすべて、GNU 一般公衆利用許諾契約書の対象である。See 付録?H. GNU General Public License。このライセンスのテキストは、ディストリビューションのファイル COPYING にある。

  2. GNU getopt ライブラリは、GNU 劣等一般公衆利用許諾契約書の対象である。http://www.fsf.org/licenses/ を参照。

  3. ソース(regexp ライブラリ)の一部は、Berkeley スタイルの著作権の対象である。

  4. MySQL の古いバージョン(3.22 以前)には、さらに厳密なライセンス(http://www.mysql.com/products/mypl.html)が適用される。個々のバージョンのマニュアルを参照。

  5. MySQL のリファレンスマニュアルは現在、GPL スタイルのライセンス下では提供されていない。このマニュアルの使用には、以下の条件が適用される。

    • 他の形式への変換が可能である。ただし、実際の内容を変更したり、編集したりすることはできない。

    • 個人的な使用を目的とする場合、マニュアルを印刷することができる。

    • 印刷したマニュアルの販売や別の出版物でのマニュアルの使用など、その他の使用方法についてはすべて、MySQL AB からの書面による事前の合意が必要である。

    詳細や翻訳に関心をお持ちの方は、Documentation Team に電子メールをお送りください。

MySQL ライセンスの施行については、項1.4.3. 「MySQL ライセンス」 を参照してください。項1.4.4. 「MySQL AB のロゴと商標」 も参照してください。

1.4.3. MySQL ライセンス

MySQL ソフトウェアは、最もよく知られていると思われるオープンソースライセンスである GNU 一般公衆利用許諾契約書GPL)に基づいてリリースされています。GPL ライセンスの正式な条件については、http://www.fsf.org/licenses/ を参照してください。http://www.fsf.org/licenses/gpl-faq.html および http://www.gnu.org/philosophy/enforcing-gpl.html も参照してください。

MySQL ソフトウェアは GPL に基づいてリリースされているので、多くの場合、無償で使用することができます。ただし、特定の用途については、https://order.mysql.com/MySQL AB から商用ライセンスを購入しなければならない場合があります。詳細については、http://www.mysql.com/products/licensing.html を参照してください。

MySQL の古いバージョン(3.22 以前)には、さらに厳密なライセンス(http://www.mysql.com/products/mypl.html)が適用されます。個々のバージョンのマニュアルを参照してください。

商用ライセンス、GPL、または古い MySQL ライセンスに基づいて MySQL ソフトウェアを使用しても、MySQL AB の商標を使用する権利が自動的に与えられるわけではないことに注意してください。 See 項1.4.4. 「MySQL AB のロゴと商標」

1.4.3.1. 商用ライセンスに基づく MySQL ソフトウェアの使用

GPL ライセンスは、プログラムが GPL プログラムにリンクしている場合、作成された製品のすべての部分のソースコードもすべて GPL に基づいてリリースする必要があるという意味で、伝染性があります。この GPL 要件に従わない場合、ライセンス条件に違反することとなり、GPL プログラムを使用する権利をすべて失います。また、損害を受ける危険を冒すことにもなります。

以下のような場合、商用ライセンスが必要です。

  • MySQL ソフトウェアの GPL コードとプログラムをリンクし、商用製品を作成するため、または追加した非 GPL コードを他の理由でクローズソースにするために、作成する製品に GPL に基づくライセンスを付与しない場合。商用ライセンスを購入すると、MySQL ソフトウェアを使用する際に、同じコードでも GPL が適用されなくなる。

  • MySQL ソフトウェアのみを使用する非 GPL アプリケーションを提供し、MySQL ソフトウェアとともに出荷する場合。このタイプのソリューションは、ネットワーク経由で行われてもリンクしていると見なされる。

  • GPL ライセンスの下で必要とされるソースコードの提供を行わずに、MySQL ソフトウェアのコピーを提供する場合。

  • 形式上は商用ライセンスが必要でなくても、MySQL データベースの今後の開発をサポートする場合。MySQL AB からサポートを直接購入することは、MySQL ソフトウェアの開発に貢献するもう 1 つのよい方法である。また、ユーザにも直接メリットがある。 See 項1.4.1. 「MySQL AB によって提供されるサポート」

ライセンスを要求する場合、MySQL ソフトウェアの各インストールに 1 つずつ必要です。これは、1 台のマシン上の CPU の数には関係ありません。また、サーバに接続するクライアントの数に理論上の制限はありません。

商用ライセンスについては、当社の Web サイト(http://www.mysql.com/products/licensing.html)を参照してください。サポート契約については、http://www.mysql.com/support/ を参照してください。特殊なニーズがある場合やインターネットにアクセスできない場合は、販売スタッフ()に電子メールでお問い合わせください。

1.4.3.2. GPL に基づく MySQL ソフトウェアの無償使用

GPL の条件に従っている場合、GPL の下で MySQL ソフトウェアを無償で使用することができます。GPL に関する一般的な質問に対する回答などの詳細については、Free Software Foundation の一般的な FAQ(http://www.fsf.org/licenses/gpl-faq.html)を参照してください。一般に、以下のような場合に GPL を使用します。

  • 独自のアプリケーションと GPL に基づく MySQL のソースコードの両方を製品とともに提供する場合。

  • 商用としてディストリビューションを販売する場合でも、機能に関して MySQL システムにリンクしていない、または MySQL システムに依存していない他のプログラムとバンドルされた MySQL のソースコードを提供する場合。これは、GPL ライセンスでは単に集約と呼ばれる。

  • MySQL システムのいずれの部分も提供しない場合、無償で使用することができる。

  • インターネットサービスプロバイダ(ISP)として、MySQL サーバを使用した Web ホスティングを顧客に提供する場合。当社は、MySQL サポートがある ISP を使用するように推奨している。これは、MySQL のインストールに関して発生しうる問題を解決するためのリソースが、実際にそれらの ISP にあるという信頼感が得られるためである。ISP に MySQL サーバの商用ライセンスがなくても、適切なパッチが適用されていることを確認できるように、顧客に少なくとも MySQL インストールのソースへの読み取りアクセス権を付与する必要がある。

  • MySQL データベースソフトウェアを Web サーバとともに使用する場合(提供する製品でない限り)、商用ライセンスは不要である。MySQL サーバを使用する市販の Web サーバを実行する場合も、同様である。これは、MySQL システムのいずれの部分も提供しないためである。ただし、この場合、MySQL ソフトウェアによって企業がサポートされているので、MySQL サポートを購入していただくよう希望する。

MySQL データベースソフトウェアの使用に商用ライセンスが不要な場合でも、MySQL AB からサポートを購入することをお勧めします。これにより、MySQL の開発に貢献することになるとともに、お客様自身も直接メリットが得られます。 See 項1.4.1. 「MySQL AB によって提供されるサポート」

MySQL データベースソフトウェアの使用によって利益を得るような商用コンテキストで MySQL データベースソフトウェアを使用する場合は、いずれかのレベルのサポートを購入することで MySQL ソフトウェアの開発のお手伝いをお願いしています。MySQL データベースがお客様のビジネスに役立っているのなら、今度はお客様が MySQL AB に手を貸してください(そうでないと、サポートに関する質問をする場合、多くの労力を要した成果を無償で使用しているだけでなく、当社に無償でサポートを提供するように依頼していることにもなります)。

1.4.4. MySQL AB のロゴと商標

Web サイト、書籍、またはボックス製品に MySQL AB のイルカのロゴを掲載したいという MySQL データベースユーザが多数いらっしゃいます。当社はこれを歓迎し、推奨しておりますが、MySQL という言葉と MySQL のイルカのロゴは MySQL AB の商標であり、http://www.mysql.com/company/trademark.html に記載されている当社の商標ポリシーに従って使用する必要があることに注意してください。

1.4.4.1. MySQL のオリジナルロゴ

MySQL のイルカのロゴは、2001 年にフィンランドの広告代理店 Priority によってデザインされたものです。頭がよく、敏捷でスリムな動物なので、データの大海原を楽々と進むということから、MySQL データベースに適したシンボルとしてイルカが選ばれました。また、私たちもイルカが好きでした。

MySQL のオリジナルロゴを使用できるのは、MySQL AB の代表者と、書面による合意によって使用が許可されたユーザのみです。

1.4.4.2. 書面による許可なしに使用できる MySQL のロゴ

当社は、Web サイト(http://www.mysql.com/press/logos.html)からダウンロードし、MySQL AB からの書面による許可なしにサードパーティの Web サイトで使用できる特殊な条件付き使用ロゴをデザインしております。これらのロゴの使用にはまったく制限はありませんが、名前のとおり、当社の商標ポリシーが適用されます。商標ポリシーも、Web サイトで参照することができます。ロゴを使用する場合は、商標ポリシーをよくお読みください。基本的な条件は以下のとおりです。

  • http://www.mysql.com/ サイトに表示されているように、必要なロゴを使用する。必要に応じてロゴのサイズを変更することはできるが、色やデザインを変更したり、グラフィックを変更したりすることはできない。

  • MySQL の商標を掲載するサイトの作成者および所有者が MySQL AB ではなく、ユーザ自身であることを明確にする。

  • MySQL ABMySQL AB の商標の価値にマイナスとなるような使い方をしない。当社は、MySQL AB の商標の使用権を無効にする権利を留保している。

  • Web サイトで商標を使用する場合、クリックすると、直接 http://www.mysql.com/ にジャンプするようにする。

  • アプリケーションで GPL に基づく MySQL データベースを使用する場合、アプリケーションはオープンソースであると同時に、MySQL サーバに接続可能でなければならない。

ニーズに合わせた特別な調整に関する質問については、 に電子メールでお問い合わせください。

1.4.4.3. MySQL のロゴの使用に書面による許可が必要な場合

以下の場合、MySQL のロゴを使用するには、MySQL AB からの書面による許可が事前に必要となります。

  • Web サイト以外の場所に MySQL AB のロゴを掲載する場合

  • 前述の条件付き使用ロゴ以外の MySQL AB のロゴを Web サイトやその他の場所に掲載する場合

法律上および商業上の理由から、当社は、製品や書籍などにおける MySQL の商標の使用を監視します。通常、商用製品に MySQL AB のロゴを掲載する場合には料金をいただきます。収益の一部が MySQL データベースの今後の開発資金として使用されるのが適切だと考えるためです。

1.4.4.4. MySQL AB のパートナシップロゴ

MySQL のパートナシップロゴを使用できるのは、MySQL AB と書面によるパートナシップ契約を結んでいる企業および個人のみです。パートナシップには、MySQL の講師またはコンサルタントとしての認定も含まれます。詳細については、項1.3.1.5. 「パートナ提携」 を参照してください。

1.4.4.5. 印刷テキストまたはプレゼンテーションにおける MySQL という言葉の使用

MySQL ABMySQL データベースの参照を歓迎しますが、MySQL という言葉は MySQL AB の商標であることに注意してください。そのため、テキスト内で MySQL という言葉を最初に使用する箇所や最も目立つように使用する箇所には商標記号(TM)を添え、必要に応じて、MySQLMySQL AB の商標であることを記載する必要があります。詳細については、商標ポリシー(http://www.mysql.com/company/trademark.html)を参照してください。

1.4.4.6. 企業名および製品名における MySQL という言葉の使用

製品名、企業名、またはインターネットドメイン名に MySQL という言葉を使用する場合は、MySQL AB からの書面による許可が必要です。

1.5. MySQL の開発ロードマップ

このセクションでは、MySQL 4.0、4.1、5.0、および 5.1 で実装または計画されている主な機能を含む、MySQL の開発ロードマップのスナップショットを提供します。バージョンシリーズごとの情報については、以下のセクションを参照してください。次の表は、最も要望があった機能の一部についての計画をまとめたものです。

機能MySQL バージョン
UNION4.0
サブクエリ4.1
R-tree4.1(MyISAM テーブル用)
ストアドプロシージャ5.0
ビュー5.0 または 5.1
カーソル5.0
外部キー5.1(InnoDBについては 3.23 で実装済み)
トリガ5.1
Full OUTER JOIN5.1
制約5.1

1.5.1. MySQL 4.0 の概要

ユーザが長い間待ち望んでいた MySQL サーバ 4.0 が運用ステータスで使用可能になりました。

MySQL 4.0 は、http://www.mysql.com/ および当社のミラーからダウンロードすることができます。MySQL 4.0 は多数のユーザによってテストされ、多数の大規模サイトで運用されています。

MySQL サーバ 4.0 の主な新機能は、当社の既存のビジネスおよびコミュニティユーザ向けに設計されており、ミッションクリティカルで負荷が高いデータベースシステムに対応したソリューションとして MySQL データベースソフトウェアを拡張します。組み込みデータベースのユーザを対象とした新機能もあります。

MySQL 4.0 は、2003 年 3 月にリリースされたバージョン 4.0.12 で、運用について安定していると宣言されました。そのため、今後、4.0 シリーズについてはバグ修正のみが行われ、古い 3.23 シリーズについては重大なバグ修正のみが行われることになります。 See 項2.5.2. 「バージョン 3.23 から 4.0 へのアップグレード」

すでに使用可能な MySQL 4.1(アルファバージョン)には、MySQL ソフトウェアの新機能が追加されます。 See 項1.5.2. 「MySQL 4.1 の概要」

1.5.1.1. MySQL 4.0 で使用可能な機能

  • 速度の向上

    • MySQL 4.0 にはクエリキャッシュがあり、反復クエリを使用するアプリケーションの速度を大幅に向上させることができる。 See 項6.9. 「MySQL クエリキャッシュ」

    • バージョン 4.0 では、一括 INSERT ステートメント、パックされたインデックスの検索、FULLTEXT インデックスの作成、および COUNT(DISTINCT) など、いくつかの領域で MySQL サーバの速度がさらに向上している。

  • 組み込み MySQL サーバの導入

    • 新しい組み込みサーバライブラリを使用すると、スタンドアロンアプリケーションおよび組み込みアプリケーションを容易に作成することができる。組み込みサーバは、クライアント/サーバ環境で MySQL を使用する 1 つの方法である。 See 項1.5.1.2. 「組み込み MySQL サーバ」

  • 標準としての InnoDB ストレージエンジン

    • InnoDB ストレージエンジンが MySQL サーバの標準機能として提供されるようになった。つまり、ACID トランザクションの完全サポート、連鎖 UPDATE および DELETE を使用した外部キー、および行レベルのロックが標準機能となっている。 See 項7.5. 「InnoDB テーブル」

  • 新機能

    • MySQL サーバ 4.0 の拡張された FULLTEXT 検索機能によって、大きいテキストの FULLTEXT インデックスが、バイナリと自然言語の両方の検索ロジックで作成可能になった。最小ワード長をカスタマイズし、任意の自然言語で独自のストップワード一覧を定義することができるため、MySQL サーバ上に新しいアプリケーションセットを構築することができる。 See 項6.8. 「MySQL 全文検索」

  • 標準への準拠、移植性、および移行

    • 他のデータベースシステムから MySQL サーバへの移行を容易にする機能として、(Oracle にある)TRUNCATE TABLE がある。

    • MySQL サーバで UNION ステートメントがサポートされるようになった。これは、多数のユーザが長い間待ち望んでいた標準の SQL 機能である。

    • MySQL が Novell NetWare 6.0 プラットフォーム上でネイティブに稼動するようになった。 See 項2.6.8. 「Novell NetWare の注意事項」

  • 国際化

    • ドイツ、オーストリア、およびスイスのユーザ向けに MySQL で新しいキャラクタセット latin1_de がサポートされるようになり、ドイツ語のソート順では、ウムラウトを含む単語がドイツの電話帳と同じ順序でソートされる。

  • 使いやすさの向上

    新しいユーザ向けの機能を実装するプロセスでも、既存のユーザの忠実なコミュニティからの要望を忘れることはありません。

    • ほとんどの mysqld パラメータ(スタートアップオプション)が、サーバを停止しなくても設定できるようになった。これは、データベース管理者(DBA)にとって便利な機能である。 See 項5.5.6. 「SET 構文」

    • 複数テーブルの DELETE および UPDATE ステートメントが追加された。

    • MyISAM ストレージエンジンにテーブルレベルの(以前のようにデータベースレベルのみではない)シンボリックリンクのサポートが追加された。また、Windows では、データベースレベルにおけるシンボリックリンクの処理がデフォルトで有効である。

    • 新しく追加された関数 SQL_CALC_FOUND_ROWSFOUND_ROWS() を使用すると、LIMIT 節を含む SELECT クエリがその節を含めない場合に返すレコードの数を調べることができる。

このマニュアルのニュースセクションに、機能の詳細な一覧があります。 See 項D.3. 「Changes in release 4.0.x (Production)」

1.5.1.2. 組み込み MySQL サーバ

libmysqld によって、MySQL サーバはアプリケーションの大規模展開に対応します。組み込み MySQL サーバライブラリを使用すると、さまざまなアプリケーションや電子機器に MySQL サーバを組み込むことができます。それらのアプリケーションや電子機器のエンドユーザには、実際はそれらの基になっているデータベースがあるということはわかりません。組み込み MySQL サーバは、インターネット機器、パブリックキオスク、ハードウェアとソフトウェアが組み合わさったターンキー装置、高性能インターネットサーバ、CD-ROMで配布されている独立言語型データベースなどの背後での使用に最適です。

libmysqld の多くのユーザは、MySQL のデュアルライセンスの恩恵を受けます。GPL に拘束されたくないユーザは、商用ライセンスに基づいてソフトウェアを使用することもできます。組み込み MySQL ライブラリでは通常のクライアントライブラリと同じインタフェースが使用されているので、使いやすく、便利です。 See 項11.1.15. 「組み込み MySQL サーバライブラリ libmysqld」

1.5.2. MySQL 4.1 の概要

MySQL サーバ 4.0 は、サブクエリや Unicode などの新機能(バージョン 4.1 で実装)および SQL-99 ストアドプロシージャの開発(バージョン 5.0 で実装)の基礎となっています。これらの機能は、当社のお客様からの要望が最も高いものです。

これらの追加機能によって、MySQL データベースサーバの批評家は、MySQL データベース管理システムの問題を指摘する際に、これまで以上に想像力が必要になります。その安定性、速度、使いやすさですでによく知られている MySQL サーバは、非常に多くを望む購入者の条件リストを満たすことができます。

1.5.2.1. MySQL 4.1 で使用可能な機能

このセクションに記載されている機能は、MySQL 4.1 に実装されています。MySQL 4.1 には、他にも計画されている機能があります。 See 項1.6.1. 「4.1 で計画されている新機能」

ストアドプロシージャなど、コード化されるほとんどの新機能は MySQL 5.0 で使用できるようになります。 See 項1.6.2. 「5.0 で計画されている新機能」

  • サブクエリと派生テーブルのサポート

    • サブクエリとは、別のステートメント内にネストされた SELECT ステートメントである。派生テーブル(名前のないビュー)とは、別のステートメントの FROM 節内のサブクエリである。 See 項6.4.2. 「サブクエリ構文」

  • 速度の向上

    • 準備されたステートメントとパラメータのバインディングによる、より速いバイナリプロトコル。 See 項11.1.4. 「C API のプリペアドステートメント」

    • HEAP テーブルについて B-TREE インデックスの作成がサポートされるようになり、正確でない検索の応答時間が大幅に短縮される。

  • 新機能

    • CREATE TABLE table_name2 LIKE table_name1 を使用することで、既存のテーブルとまったく同じ構造の新しいテーブルを 1 つのステートメントで作成することができる。

    • OpenGIS 空間データ型(地理データ)のサポート。 See 章?10. MySQL における空間情報の機能

    • SSL 接続を介したレプリケーションを実行することができる。

  • 標準への準拠、移植性、および移行

    • 新しいクライアント/サーバプロトコルにより、1 つの結果だけでなく、複数の警告をクライアントに渡す機能が追加される。これにより、データの一括ロードなどのジョブが追跡しやすくなる。SHOW WARNINGS は、最後のコマンドの警告を表示する。 See 項4.6.8.9. 「SHOW WARNINGS | ERRORS

  • 国際化

    • アプリケーションで各国語を使用するユーザベースの拡大に対応するために、MySQL ソフトウェアでは、utf8 および ucs2 キャラクタセットによる幅広い Unicode サポートが提供されるようになった。

    • カラム、テーブル、およびデータベースごとにキャラクタセットを定義できるようになった。これにより、特に多言語 Web サイトを対象としたアプリケーション設計で高度な柔軟性が実現する。

    • 改善されたこのキャラクタセットサポートについては、章?9. 各国キャラクタセットと Unicode を参照。

  • 使いやすさの向上

    • よく寄せられる要望に応じて、SQL ステートメントに関するヘルプ情報を取得するために使用できるサーバベースの HELP コマンドを追加した。サーバ側でこの情報を取得できるメリットは、情報が常にその特定のサーババージョンに該当する点である。この情報は SQL ステートメントを発行することで参照できるので、任意のクライアントをそれにアクセスするように記述することができる。たとえば、mysql コマンドラインクライアントはこの機能を使用できるように変更されている。

    • 新しいクライアント/サーバプロトコルでは、1 回の呼び出しで複数のステートメントを発行することができる。 See 項11.1.8. 「C API における複数クエリの実行の取り扱い」

    • 新しいクライアント/サーバプロトコルでは、複数の結果セットを返すこともできる。これは、たとえば、複数のステートメントを送信した結果として行われることがある(前の項目を参照)。

    • 新しい INSERT ... ON DUPLICATE KEY UPDATE ... 構文が実装された。この構文を使用すると、INSERT によって PRIMARY または UNIQUE キー(インデックス)で重複が発生した場合に既存のレコードを更新することができる。 See 項6.4.3. 「INSERT 構文」

    • 新しい集約関数 GROUP_CONCAT() を実装した。この関数によって、グループ化されたレコードのカラムを 1 つの結果文字列に連結する非常に便利な機能が追加される。 See 項6.3.7. 「GROUP BY 節で使用する関数と修飾子」

このマニュアルのニュースセクションに、機能の詳細な一覧があります。 See 項D.2. 「Changes in release 4.1.x (Alpha)」

1.5.2.2. 段階的ロールアウト

MySQL 4.1 には、新しい機能が追加されます。アルファバージョンは、すでにダウンロードすることができます。 See 項1.5.2.3. 「即時の開発用途への対応」

バージョン 4.1 に追加される機能は、ほとんど確定しています。すでに、バージョン 5.0 に向けて新たな開発が行われています。MySQL 4.1 はアルファ(さらに新機能が追加/変更される可能性がある段階)、ベータ(機能が固定され、バグ修正のみが行われる段階)、ガンマ(製品版としてのリリースを数週間後に控えた段階)というステップをたどります。このプロセスの最後に、MySQL 4.1 は新しい製品版となります。

1.5.2.3. 即時の開発用途への対応

現在、MySQL 4.1 はアルファ段階にあり、http://www.mysql.com/downloads/mysql-4.1.html でバイナリリリースをダウンロードすることができます。すべてのバイナリリリースは、テストするプラットフォームでエラーが発生することなく、一連の広範なテストに合格しています。 See 項D.2. 「Changes in release 4.1.x (Alpha)」

MySQL 4.1 の最新の開発ソースの使用を希望するユーザのために、4.1 BitKeeper リポジトリを公開しています。 See 項2.3.4. 「開発ソースツリーからのインストール」

1.5.3. MySQL 5.0、次期開発リリース

MySQL の新たな開発は、ストアドプロシージャなどの新機能を特徴とする 5.0 リリースに焦点が置かれています。 See 項1.6.2. 「5.0 で計画されている新機能」

MySQL 開発の最前線の参照を希望するユーザのために、MySQL バージョン 5.0 の BitKeeper リポジトリを公開しています。 See 項2.3.4. 「開発ソースツリーからのインストール」

1.6. MySQL の今後(TODO)

このセクションでは、MySQL サーバに実装予定の機能の概要を説明します。一覧はバージョンごとに分かれており、項目はほぼ、実装される順序に並んでいます。

注意: 特定の機能を至急必要とする企業レベルのユーザは、支援オプションについて にお問い合わせください。スポンサー企業からの特定の目的に絞った資金提供によって、その目的のために特別なリソースを割り当てることができます。過去に資金提供を受けた機能の例として、レプリケーションがあります。

1.6.1. 4.1 で計画されている新機能

以下の機能は、MySQL 4.1 にまだ実装はされていませんが、MySQL 4.1 がベータ段階に移行する前に実装される予定です。MySQL 4.1 にすでに実装されている機能の一覧については、項1.5.2.1. 「MySQL 4.1 で使用可能な機能」 を参照してください。

  • 安定した OpenSSL サポート(MySQL 4.0 でも基本的にはサポートされているが、100% テストされているわけではない)。

  • 準備されたステートメントのより詳細なテスト。

  • 1 つのテーブルで使用する複数のキャラクタセットのより詳細なテスト。

1.6.2. 5.0 で計画されている新機能

MySQL 5.0 には、以下の機能が組み込まれる予定です。多数の開発者がさまざまなプロジェクトで作業しているので、他にも多くの機能があることに注意してください。これらの機能の一部は、MySQL 4.1 に追加される可能性もあります。MySQL 4.1 にすでに実装されている機能の一覧については、項1.5.2.1. 「MySQL 4.1 で使用可能な機能」 を参照してください。

MySQL 開発の最前線の参照を希望するユーザのために、MySQL バージョン 5.0 の BitKeeper リポジトリを公開しています。 See 項2.3.4. 「開発ソースツリーからのインストール」

  • ストアドプロシージャ

    • ストアドプロシージャは、現在実装中である。この試みは SQL-99 に基づくもので、Oracle PL/SQL に類似した(ただし、同じではない)基本構文を使用する。また、外部言語でフックする SQL-99 フレームワーク、および(可能な場合)PL/SQL や T-SQL などとの互換性も実装する予定である。

  • 新機能

    • 基本的なカーソルサポート。

    • MyISAM テーブルでインデックスが R-TREE インデックスとして作成されるように明示的に指定する機能。4.1 では、地理データ(GIS データ型)について R-TREE インデックスが内部で使用されるが、必要に応じて作成することはできない。

    • HEAP テーブルの可変長レコード。

  • 標準への準拠、移植性、および移行

    • VARCHAR の完全なサポート(255 を超えるカラム長、後続のスペースを削除しない)の追加(MyISAM ストレージエンジンではすでにこれがサポートされているが、ユーザレベルではまだ使用できない)。

  • 速度の向上

    • SHOW COLUMNS FROM table_name(カラム名の表示を可能にするために mysql クライアントによって使用される)によって、テーブルではなく定義ファイルのみが開くようにする。これによって、使用されるメモリが少なくて済むとともに、速度がはるかに向上する。

    • MyISAM テーブルの DELETE でレコードキャッシュを使用できるようにする。そのためには、.MYD ファイルを更新する際にスレッドレコードキャッシュを更新する必要がある。

    • メモリ内(HEAP)テーブルの改良。

      • 可変長レコード

      • より迅速なレコード処理(コピーの削減)

  • 国際化

    • SET CHARACTER SET を使用する場合、文字列だけでなく、クエリ全体が一度に変換されるようにする必要がある。これによって、ユーザはデータベース名、テーブル名、およびカラム名で変換された文字を使用できるようになる。

  • 使いやすさの向上

    • アクティブな MERGE テーブルで使用されているテーブルに対して RENAME TABLE を発行した場合にテーブルが破損する可能性がある問題の解決。

1.6.3. 5.1 で計画されている新機能

  • 新機能

    • すべてのテーブル型での FOREIGN KEY のサポート。

    • カラムレベルの制約。

    • 緊急時のレプリケーション。

    • パフォーマンスへの影響が非常に少ないオンラインバックアップ。オンラインバックアップによって、マスタを停止せずに新しいレプリケーションスレーブを簡単に追加できるようになる。

  • 速度の向上

    • テキストベースの新しいテーブル定義ファイル形式(.frm ファイル)とテーブル定義に使用されるテーブルキャッシュ。これによって、テーブル構造のクエリが高速になるとともに、より効率的な外部キーサポートが実現する。

    • 1 ビットを使用するように BIT 型を最適化する(現在、BIT は 1 バイトを必要とし、TINYINT のシノニムとして扱われている)。

  • 使いやすさの向上

    • クライアント/サーバプロトコルに、長時間実行されているコマンドの進捗状況を参照するオプションを追加する。

    • RENAME DATABASE を実装する。すべてのストレージエンジンについてこれを安全にするには、以下のように動作する必要がある。

      • 新しいデータベースを作成する。

      • RENAME コマンドを使用して行われるように、すべてのテーブルについて、別のデータベースへのテーブルの名前変更を行う。

      • 元のデータベースを破棄する。

    • 内部ファイルインタフェースの変更。これによって、すべてのファイル処理がはるかに一般的になるとともに、RAID のように簡単に拡張子を追加できるようになる。

1.6.4. 近い将来に計画されている新機能

  • 新機能

    • ツリー形式(階層状)の構造を検索する Oracle のような CONNECT BY PRIOR ...

    • 不足しているすべての SQL-92 および ODBC 3.0 型を追加する。

    • SUM(DISTINCT) を追加する。

    • テーブルの読み取りがロックされている場合、テーブルの最後で同時挿入を行う INSERT SQL_CONCURRENT および mysqld --concurrent-insert

    • UPDATE TABLE foo SET @a=a+b,a=@a, b=@a+c のように、UPDATE ステートメントでの変数の更新を有効にする。

    • ユーザ変数が更新される場合、SELECT id, @a:=COUNT(*), SUM(sum_col)/@a FROM table_name GROUP BY id のように GROUP BY とともに使用できるように変更する。

    • TIMESTAMP および AUTO_INCREMENT フィールドを更新しないように LOAD DATA INFILEIMAGE オプションを追加する。

    • 次のように動作する LOAD DATA INFILE ... UPDATE 構文を追加する。

      • 主キーがあるテーブルについて、入力レコードに主キー値が含まれている場合、その主キー値と一致する既存のレコードはその他の入力カラムから更新される。ただし、入力レコードにないカラムに対応するカラムはそのままになる。

      • 主キーがあるテーブルについて、入力レコードに主キー値が含まれていない場合やキーの一部がない場合、レコードは LOAD DATA INFILE ... REPLACE INTO として処理される。

    • LOAD DATA INFILE で次のような構文が認識されるようにする。

      LOAD DATA INFILE 'file_name.txt' INTO TABLE tbl_name
           TEXT_FIELDS (text_field1, text_field2, text_field3)
           SET table_field1=CONCAT(text_field1, text_field2),
               table_field3=23
           IGNORE text_field3
      

      これを使用すると、テキストファイル内の余分なカラムをスキップしたり、読み取ったデータの式に基づいてカラムを更新したりすることができる。

    • SET 型のカラムを使用する新しい関数。

      • ADD_TO_SET(value,set)

      • REMOVE_FROM_SET(value,set)

    • クエリの途中で mysql を停止する場合、別の接続を開き、実行中の元のクエリを終了する必要がある。または、サーバでこれが検出されるようにする必要がある。

    • システムテーブルとして使用できるように、テーブル情報のストレージエンジンインタフェースを追加する。これは、すべてのテーブルに関する情報を要求した場合には多少遅くなるが、非常に柔軟である。基本的なテーブル情報を対象とした SHOW INFO FROM tbl_name が実装される。

    • SELECT a FROM table_name1 LEFT JOIN table_name2 USING (a) を有効にする。この場合、a は、table_name1 テーブルに由来すると想定される。

    • UPDATE ステートメントの DELETE および REPLACE オプション(これによって、更新時に重複キーエラーが発生した場合、レコードが削除されるようになる)。

    • 秒の小数部を格納するように DATETIME の書式を変更する。

    • 現在のライブラリの代わりに、新しい GNU regexp ライブラリを使用できるようにする(新しいライブラリは、現在のライブラリよりはるかに高速である)。

  • 標準への準拠、移植性、および移行

    • カラムに自動 DEFAULT 値が追加されないようにする。DEFAULT がないカラムについては、INSERT ステートメントに値がない場合、エラーを生成する。

    • ANY()EVERY()、および SOME() グループ関数を追加する。標準の SQL では、これらはブール型のカラムのみで動作するが、0 値を FALSE、0 以外の値を TRUE として処理することで、あらゆるカラム/式で動作するように拡張することができる。

    • MAX(column) の型をカラム型と同じになるように固定する。

      mysql> CREATE TABLE t1 (a DATE);
      mysql> INSERT INTO t1 VALUES (NOW());
      mysql> CREATE TABLE t2 SELECT MAX(a) FROM t1;
      mysql> SHOW COLUMNS FROM t2;
      

  • 速度の向上

    • 定義された数を超えるスレッドで同時に MyISAM リカバリが実行されないようにする。

    • 必要に応じて同時挿入を使用するように INSERT ... SELECT を変更する。

    • しばらく使用されていない場合、遅延キーが設定されているテーブルのキーページを定期的にフラッシュするオプションを追加する。

    • キー部分での結合を有効にする(最適化の問題)。

    • Windows での pread()/pwrite() のシミュレーションを追加して、同時挿入を有効にする。

    • 最も頻繁にヒットするテーブル、複数テーブルの結合が実行される頻度などに関する情報を解析できるログファイルアナライザを追加する。これは、はるかに効率的なクエリを実行するように最適化することができる領域やテーブル設計を特定する上で便利である。

  • 国際化

  • 使いやすさの向上

    • SELECT MIN(column) ... GROUP BY の実行時に、元のフィールド型を返す。

    • long_query_time をマイクロ秒単位で詳細に指定できるようにする。

    • PACK または COMPRESS 操作を実行できるように、myisampack コードをサーバにリンクする。

    • インデックスファイルがいっぱいになった場合にリカバリできるように、INSERT/DELETE/UPDATE 時にテンポラリキーバッファキャッシュを追加する。

    • 別のディスクにシンボリックリンクされているテーブルで ALTER TABLE を実行する場合、そのディスクにテンポラリテーブルを作成する。

    • タイムゾーンが異なる日付の処理を容易にするために、タイムゾーン情報を適切に処理する DATE/DATETIME 型を実装する。

    • スレッドを使用せずにすべてのライブラリ(MyISAM など)をコンパイルできるように、configure を固定する。

    • LIMIT @a,@b のように、SQL 変数を LIMIT の引数として使用できるようにする。

    • mysql から Web ブラウザへの自動出力。

    • LOCK DATABASES(およびさまざまなオプション)。

    • SHOW STATUS によって表されるさまざまな数値。レコードの読み取りおよび更新。1 つのテーブルに対する SELECT および結合を使用した SELECT。 SELECT されたテーブルの平均数。ORDER BY および GROUP BY クエリの数。

    • mysqladmin copy database new-database。このためには、COPY 操作を mysqld に追加する必要がある。

    • プロセス一覧の出力にクエリ/スレッドの数が示されるようにする。

    • ホスト名キャッシュに関する情報を出力するための SHOW HOSTS

    • 計算されたカラムについて、空白文字列から NULL にテーブル名を変更する。

    • SELECT COUNT(*)*(id+0) FROM table_name GROUP BY id の場合、数字 -> 文字列 -> 数字という変換を避けるために、数値に対して Item_copy_string を使用しない。

    • INSERT DELAYED を実行するクライアントが ALTER TABLE によって停止されないように変更する。

    • UPDATE 節でカラムが参照されている場合、更新が開始される前の古い値がカラムに含まれるように固定する。

  • 新しいオペレーティングシステム

    • LynxOS への MySQL クライアントの移植。

1.6.5. 中期的な将来に計画されている新機能

  • 関数 get_changed_tables(timeout,table1,table2,...) を実装する。

  • 可能な場合、テーブルの読み取りで memmap が使用されるように変更する。現時点では、圧縮されたテーブルのみで memmap が使用されている。

  • 自動タイムスタンプコードをより適切なものにする。SET TIMESTAMP=#; を使用して更新ログにタイムスタンプを追加する。

  • 速度を向上させるために、いくつかの場所で読み取り/書き込み相互排他ロック(mutex)を使用する。

  • シンプルなビュー(完全な機能装備まで段階的に実装)。 See 項1.8.4.6. 「ビュー」

  • テーブル、テンポラリテーブル、またはテンポラリファイルでエラー 23(開いているファイルが十分でない)が発生した場合、一部のテーブルを自動的に閉じる。

  • 定数の伝搬を改良する。式で col_name=n が見つかると、定数 n の場合、式内の他の col_namen に置換する。現時点では、単純なケースのみでこれが行われている。

  • 可能な場合、計算式を使用してすべての定数式を変更する。

  • キー = 式を最適化する。現時点では、キー = フィールドまたはキー = 定数のみが最適化されている。

  • より適切なコード化のためにコピー関数の一部を結合する。

  • サイズを削減し、より適切なエラーメッセージを取得するように、sql_yacc.yy をインラインパーサに変更する(5 日)。

  • 関数内のさまざまな数の引数について 1 つのルールのみが使用されるようにパーサを変更する。

  • 命令部で完全な計算名を使用する(ACCESS97 に対応)。

  • MINUSINTERSECT、および FULL OUTER JOIN(現時点では、UNION(4.0)と LEFT|RIGHT OUTER JOIN がサポートされている)。

  • クエリに時間制限を設定するために、SQL_OPTION MAX_SELECT_TIME=# を使用できるようにする。

  • 更新ログからデータベースへの書き込みを可能にする。

  • 結果セットの最後からデータを取得できるように LIMIT を拡張する。

  • クライアントの接続/読み取り/書き込み機能に関する警告。

  • mysqld_safe に対する変更には注意が必要である。Debian が準拠しようとしている FSSTND に従って、PID ファイルは /var/run/<progname>.pid に、ログファイルは /var/log に格納される必要がある。"pidfile" および "log" の最初の宣言に "DATADIR" を挿入すると、これらのファイルの場所を 1 つのステートメントで変更することができるので、便利である。

  • クライアントがログを要求できるようにする。

  • gzip によって圧縮されたファイルをステートメントで読み込めるように、LOAD DATA INFILEzlib() の使用を追加する。

  • BLOB 型のカラムのソートおよびグループ化を固定する(現時点では、部分的に解決されている)。

  • スレッドをカウントする際にセマフォを使用するように変更する。まず、MIT-pthreads のセマフォライブラリを実装する必要がある。

  • かっこを含む JOIN の完全サポートを追加する。

  • シングルスレッド/接続の代わりに、スレッドのプールを利用してクエリを処理する。

  • GET_LOCK() で複数のロックを取得できるようにする。これを実行した場合、この変更によって発生する可能性があるデッドロックも処理する必要がある。

時間は、実際の時間ではなく、作業量に基づいて記されています。

1.6.6. 計画されていない新機能

SQL-92/SQL-99 への完全な準拠を目標としています。実装を計画していない機能はありません。

1.7. MySQL の情報源

1.7.1. MySQL メーリングリスト

このセクションでは MySQL メーリングリストの概要を説明するとともに、リストの使用方法に関するガイドラインを提供します。メーリングリストを購読すると、リストへのすべての投稿が電子メールメッセージとして送信されます。また、自分の質問や回答をリストに送信することもできます。

1.7.1.1. MySQL メーリングリスト

このセクションに記載されているメーリングリストを購読する場合または購読を中止する場合は、http://lists.mysql.com/ にアクセスしてください。購読または購読中止に関するメッセージはいずれのメーリングリストにも送信しないでください。送信した場合、そのメッセージが多数の他のユーザに自動的に配信されてしまいます。

ローカルサイトに MySQL メーリングリストの購読者が多数いる場合、lists.mysql.com からサイトに送信されたメッセージがローカルリストに配信されるように、ローカルのメーリングリストが作成されている場合があります。このような場合、ローカルの MySQL リストへの追加またはリストからの削除については、システム管理者にお問い合わせください。

メールプログラム内の個別のメールボックスにメーリングリストが送信されるようにするには、メッセージヘッダに基づいてフィルタを設定してください。List-ID: または Delivered-To: ヘッダを使用して、リストのメッセージを識別することができます。

MySQL メーリングリストは以下のとおりです。

  • announce

    このリストは、新しいバージョンの MySQL および関連するプログラムの通知に使用される。これは、すべての MySQL ユーザが購読する必要がある、ボリュームの小さいリストである。

  • mysql

    これは、MySQL に関する一般的なディスカッションに使用されるメインのリストである。トピックによっては、より専門的なリストでディスカッションを行ったほうがよいものもある。適切でないリストに投稿すると、回答が得られないことがある。

  • mysql-digest

    これは、ダイジェスト形式の mysql リストである。このリストを購読すると、全リストのメッセージを受け取ることになる。これは、1 日 1 回大きなメールメッセージとして送信される。

  • bugs

    これは、MySQL の最新リリース以降に報告された問題を常に把握しておきたいユーザや、バグの検出と修正のプロセスに積極的に参加したいユーザにとって興味深いリストである。 See 項1.7.1.3. 「バグまたは問題を報告する方法」

  • bugs-digest

    これは、ダイジェスト形式の bugs リストである。

  • internals

    このリストは、MySQL コードに携わる人を対象としている。また、MySQL の開発およびポストパッチに関するディスカッションを行うフォーラムでもある。

  • internals-digest

    これは、ダイジェスト形式の internals リストである。

  • mysqldoc

    このリストは、MySQL AB の従業員、翻訳者、およびその他のコミュニティメンバなど、MySQL のマニュアルに携わる人を対象としている。

  • mysqldoc-digest

    これは、ダイジェスト形式の mysqldoc リストである。

  • benchmarks

    このリストは、パフォーマンスに関する問題に関心がある人を対象としている。データベースのパフォーマンス(MySQL に限らない)に関するディスカッションが中心だが、カーネル、ファイルシステム、ディスクシステムのパフォーマンスなど、より広範なカテゴリも含まれる。

  • benchmarks-digest

    これは、ダイジェスト形式の benchmarks リストである。

  • packagers

    このリストは、MySQL のパッケージおよびディストリビューションに関するディスカッションに使用される。これは、MySQL のパッケージに関するアイデアや、サポートされているすべてのプラットフォームおよびオペレーティングシステムでできる限り同じような MySQL の外観を確保するためのアイデアを交換するためにディストリビューション管理者によって使用されるフォーラムである。

  • packagers-digest

    これは、ダイジェスト形式の packagers リストである。

  • java

    このリストは、MySQL サーバおよび Java に関するディスカッションに使用される。MySQL Connector/J を含む、JDBC ドライバに関するディスカッションに使用されることがほとんどである。

  • java-digest

    これは、ダイジェスト形式の java リストである。

  • win32

    このリストは、Windows 9x/Me/NT/2000/XP などの Microsoft オペレーティングシステムで実行される MySQL ソフトウェアに関するすべてのトピックに使用される。

  • win32-digest

    これは、ダイジェスト形式の win32 リストである。

  • myodbc

    このリストは、ODBC を使用した MySQL サーバへの接続に関するすべてのトピックに使用される。

  • myodbc-digest

    これは、ダイジェスト形式の myodbc リストである。

  • mysqlcc

    このリストは、MySQL Control Center グラフィカルクライアントに関するすべてのトピックに使用される。

  • mysqlcc-digest

    これは、ダイジェスト形式の mysqlcc リストである。

  • plusplus

    このリストは、MySQL への C++ API を使用したプログラミングに関するすべてのトピックに使用される。

  • plusplus-digest

    これは、ダイジェスト形式の plusplus リストである。

  • msql-mysql-modules

    このリストは、現在 DBD-mysql と呼ばれている msql-mysql-modules を使用した MySQL の Perl サポートに関するすべてのトピックに使用される。

  • msql-mysql-modules-digest

    これは、ダイジェスト形式の msql-mysql-modules リストである。

質問に対する回答が MySQL メーリングリストから得られなかった場合、MySQL AB から有料でサポートを受ける方法があります。その場合は、MySQL の開発者と直接連絡を取ることができます。 See 項1.4.1. 「MySQL AB によって提供されるサポート」

以下は、英語以外の言語による MySQL メーリングリストです。これらのリストは MySQL AB が運営しているものではないので、品質は保証いたしません。

  • フランス語のメーリングリスト , 韓国語のメーリングリスト

    このリストに subscribe mysql your@e-mail.address を電子メールでお送りください。

  • ドイツ語のメーリングリスト

    このリストに subscribe mysql-de your@e-mail.address を電子メールでお送りください。このメーリングリストについては、http://www.4t2.com/mysql/ を参照してください。

  • ポルトガル語のメーリングリスト

    このリストに subscribe mysql-br your@e-mail.address を電子メールでお送りください。

  • スペイン語のメーリングリスト

    このリストに subscribe mysql your@e-mail.address を電子メールでお送りください。

1.7.1.2. 質問またはバグの報告

バグレポートまたは質問を投稿する前に、以下のことを行ってください。

  • 次の場所で MySQL のオンラインマニュアルを検索する。 http://www.mysql.com/doc/ マニュアルは、常に最新の状態にしておくために、新しく見つかった問題に対する解決策によって頻繁に更新されている。問題に対する解決策が新しいバージョンにすでに組み込まれている可能性が高いので、変更履歴に関する付録(http://www.mysql.com/doc/en/News.html)は特に便利である。

  • バグデータベース(http://bugs.mysql.com/)を検索して、バグがすでに報告/解決されているかどうかを確認する。

  • 次の場所で MySQL メーリングリストのアーカイブを検索する。 http://lists.mysql.com/

  • また、http://www.mysql.com/search/ を使用して、http://www.mysql.com/ にある Web ページすべて(マニュアルを含む)を検索することもできる。

マニュアルやアーカイブで回答を見つけることができなかった場合、ローカルの MySQL の専門家とともに調べてください。それでも質問に対する回答を見つけることができなかった場合は、当社に問い合わせる前に、次のセクションに記載されているガイドラインに従って MySQL メーリングリストにメールをお送りください。

1.7.1.3. バグまたは問題を報告する方法

当社のバグデータベースは公開されているので、すべてのユーザが http://bugs.mysql.com/ で参照および検索することができます。システムにログインすると、新しいレポートを入力することもできます。

適切なバグレポートを作成するには忍耐が必要ですが、最初に正しく作成しておくと、当社にとってもユーザ自身にとっても時間の節約になります。バグの詳細なテストケースを含む適切なバグレポートの場合、次のリリースでバグが修正される可能性が非常に高くなります。このセクションでは、当社にとってあまり、またはまったく役に立たない作業にユーザが時間を費やさなくて済むように、レポートを正しく作成する方法を説明します。

バグレポート(または問題に関するレポート)の生成には mysqlbug スクリプトを使用することをお勧めします。mysqlbug は、scripts ディレクトリ(ソースディストリビューション)および MySQL インストールディレクトリ下の bin ディレクトリ(バイナリディストリビューション)にあります。mysqlbug を使用することができない場合でも(Windows を使用している場合など)、このセクションに記されている必要な情報すべてをレポートに記載する必要があります(最も重要なのは、オペレーティングシステムの説明と MySQL バージョンです)。

mysqlbug スクリプトを使用すると、以下の情報のほとんどを自動的に確認することができるので、簡単にレポートを生成することができます。ただし、重要な情報が不足している場合は、その情報をメッセージに追加してください。このセクションをよく読んで、ここに記されているすべての情報をレポートに記載してください。

できれば、MySQL サーバの最新の製品版または開発版を使用して問題をテストしてから投稿してください。だれもが記載されているテストケースで mysql test < script を使用するだけでバグを再現したり、バグレポートに含まれているシェルまたは Perl スクリプトを実行したりすることができるようにする必要があります。

バグデータベース(http://bugs.mysql.com/)に投稿されたすべてのバグは、次の MySQL リリースで修正または文書化されます。小規模なコードの変更のみで問題を修正できる場合は、当社でも問題を修正するパッチを投稿します。

バグを報告する場所は通常、http://bugs.mysql.com/ です。

MySQL で重大なセキュリティバグを見つけた場合は、 に電子メールをお送りください。

再現可能なバグレポートがある場合、バグデータベース(http://bugs.mysql.com/)に報告してください。この場合も、まず mysqlbug スクリプトを実行して、システムに関する情報を確認することをお勧めします。再現可能なバグは、次の MySQL リリースで修正される可能性が高くなります。

他の問題を報告する場合は、MySQL メーリングリストのいずれかを使用してください。

情報が多すぎるメッセージに対応することはできますが、少なすぎるメッセージに対応することはできません。多くの場合、問題の原因がわかっていると思い、細部を重要でないと考えるため、事実を省略してしまいます。記載するかどうかを迷ったときは、記載することをお勧めします。最初に十分な情報を記載していなかったために再度質問して、回答を待たなければならなくなるよりも、レポートに数行を追加する方が、はるかに時間が節約される上に、煩わしくありません

バグレポートで最もよくある誤りは、(a) 使用している MySQL ディストリビューションのバージョン番号を記載していない、(b) MySQL サーバがインストールされているプラットフォームの説明(プラットフォームの種類およびバージョン番号を含む)が十分でないというものです。これは非常に重要な情報なので、ほとんどの場合、この情報が記載されていないバグレポートは役に立ちません。``この機能が使用できないのはなぜですか?'' という質問を受けることがよくあります。その場合、要求した機能がその MySQL バージョンに実装されていなかったり、レポートに記載されているバグが新しい MySQL バージョンですでに修正されていたりすることがあります。エラーがプラットフォーム依存である場合もあります。そのような場合、オペレーティングシステムやプラットフォームのバージョン番号を知らないで問題を修正することはほとんど不可能です。

また、コンパイラが問題に関連している場合は、コンパイラに関する情報も記載してください。ユーザがコンパイラのバグを見つけると、MySQL 関連の問題であると考えることがよくあります。ほとんどのコンパイラは常に開発中なので、バージョンごとに改良されています。問題がコンパイラに関連するものであるかどうかを判断するには、使用しているコンパイラを知る必要があります。コンパイルに関するすべての問題はバグと見なし、適宜報告してください。

問題に関する適切な説明がバグレポートに記載されていると、最も効果的です。そのため、問題につながったすべての操作の適切な例を挙げ、問題自体を詳細に記述してください。最も効果的なレポートは、バグや問題を再現する方法を示す詳細な例が記載されたものです。 See 項E.1.6. 「テーブルが破損した場合にテストケースを作成する」

プログラムでエラーメッセージが生成された場合、そのメッセージをレポートに記載することが非常に重要です。プログラムを使用するアーカイブから情報を検索しようとする場合、報告されたエラーメッセージがプログラムで生成されたものと正確に一致している方が効果的です(大文字小文字の違いにも注意してください)。エラーメッセージを覚えるのではなく、メッセージ全体をレポートにコピーして貼り付けてください。

MyODBC に関する問題がある場合、MyODBC トレースファイルを生成し、レポートともに送信してください。 See 項11.2.7. 「MyODBC に関する問題の報告」

レポートを読むユーザの多くが 80 桁ディスプレイを使用します。したがって、mysql コマンドラインツールを使用してレポートまたはサンプルを生成する際には、そのようなディスプレイの有効な幅を超える出力については、--vertical オプション(または \G ステートメント終端記号)を使用する必要があります(たとえば、EXPLAIN SELECT ステートメントの場合。このセクションの後述のサンプルを参照)。

レポートには以下の情報を記載してください。

  • 使用している MySQL ディストリビューションのバージョン番号(MySQL バージョン 4.0.12 など)。実行しているバージョンを確認するには、mysqladmin version を実行する。mysqladmin は、MySQL インストールディレクトリ下の bin ディレクトリにある。

  • 問題が発生したマシンの製造元とモデル。

  • オペレーティングシステムの名前とバージョン。ほとんどのオペレーティングシステムでは、この情報を取得するには、Unix コマンド uname -a を実行する。Windows を使用している場合、名前とバージョン番号を取得するには、通常 ``マイ コンピュータ'' アイコンをダブルクリックし、``ヘルプ/バージョン情報'' メニューをプルダウンする。

  • メモリ(実メモリと仮想メモリ)の量が関連することもある。関連していると思われる場合は、これらの値を記載する。

  • MySQL ソフトウェアのソースディストリビューションを使用している場合、使用しているコンパイラの名前とバージョン番号が必要である。バイナリディストリビューションを使用している場合は、ディストリビューション名が必要である。

  • コンパイル時に問題が発生した場合、正確なエラーメッセージ、およびエラーが発生したファイル内の問題のあるコード付近の数行のコンテキストを記載する。

  • mysqld が停止した場合、mysqld のクラッシュの原因となったクエリも報告する必要がある。通常、ログを有効にして mysqld を実行すると、これを検出することができる。 See 項E.1.5. 「mysqld におけるエラーの原因をログファイルを使用して特定する」

  • データベーステーブルが問題に関連している場合、mysqldump --no-data db_name tbl_name1 tbl_name2 ... からの出力を記載する。これを行うのは非常に簡単だが、データベース内のテーブルに関する情報を取得する強力な方法である。この情報は、発生した状況と同じ状況を再現する際に役立つ。

  • SELECT ステートメントの速度に関するバグや問題については、必ず EXPLAIN SELECT ... の出力と、少なくとも SELECT ステートメントによって生成されたレコードの数を記載する必要がある。また、関連する各テーブルの SHOW CREATE TABLE tbl_name からの出力も記載する。発生した状況を説明する情報が詳細であるほど、的確な回答を得られる可能性が高くなる。次は、非常に適切なバグレポートの例である(当然のことながら、mysqlbug スクリプトを使用して投稿されたものである)。

    mysql コマンドラインツールを使用して実行したサンプル(出力幅が 80 桁ディスプレイ装置の出力幅を超えるステートメントへの \G ステートメント終端記号の使用に注意)

    mysql> SHOW VARIABLES;
    mysql> SHOW COLUMNS FROM ...\G
    <SHOW COLUMNS からの出力>
    mysql> EXPLAIN SELECT ...\G
           <EXPLAIN からの出力>
    mysql> FLUSH STATUS;
    mysql> SELECT ...;
           <クエリの実行に要した時間を含む、
           SELECT からの簡略な出力>
    mysql> SHOW STATUS;
           <SHOW STATUS からの出力>
    
  • mysqld の実行中にバグまたは問題が発生した場合、その異常を再現する入力スクリプトを提供する。このスクリプトには、必要なソースファイルを含める必要がある。スクリプトによって再現される状況が実際に発生した状況に近いほど、効果的である。再現可能なテストケースを作成できる場合は、優先的に処理されるように http://bugs.mysql.com/ にそのテストケースを投稿する。

    スクリプトを提供できない場合は、少なくとも mysqladmin variables extended-status processlist からの出力をメールに記載して、システムの動作に関する情報を提供する必要がある。

  • 数行ではテストケースを再現できない場合や、テストテーブルが大きすぎてメーリングリストに送信できない場合(10 レコードを超えるテーブル)、mysqldump を使用してテーブルをダンプし、問題を説明する README ファイルを作成する必要がある。

    targzip または zip を使用してファイルの圧縮アーカイブを作成し、ftp を使用してそのアーカイブを ftp://support.mysql.com/pub/mysql/secret/ に転送する。その後、バグデータベース(http://bugs.mysql.com/)に問題を入力する。

  • MySQL サーバでクエリによって正しくない結果が生成されたと思う場合、結果だけでなく、正しいと考える結果と、その考えの根拠を示す説明も記載する。

  • 問題のサンプルを提供する際には、新しい名前を使用するよりも、実際の状況で使用している変数名やテーブル名などを使用するのが適切である。問題が、変数やテーブルの名前に関連している可能性があるためである。このようなケースはほとんどないと思われるが、後悔するよりも安全策をとるべきである。結局、実際の状況に基づいたサンプルを提供する方がユーザにとって簡単であると同時に、当社にとっても効率的である。データを他のユーザに公開したくない場合は、ftp を使用して ftp://support.mysql.com/pub/mysql/secret/ に転送することができる。データが実際に最高機密であり、当社にも公開したくない場合は、他の名前を使用したサンプルを提供することもできるが、これは最後の選択肢である。

  • 可能な場合、関連するプログラムのすべてのオプションを記載する。たとえば、mysqld デーモンを開始する際に使用したオプションや MySQL クライアントプログラムの実行に使用したオプションを記載する。mysqldmysql のようなプログラムのオプションや configure スクリプトのオプションは多くの場合、回答への手がかりとなり、非常に重要である。これらを記載することは、決して無駄ではない。Perl や PHP などのモジュールを使用している場合は、それらのバージョン番号も記載する。

  • 質問が特権システムに関連する場合、mysqlaccess の出力、mysqladmin reload の出力、および接続しようとした際に表示されたすべてのエラーメッセージを記載する。権限をテストする際には、まず mysqlaccess を実行する。その後、mysqladmin reload version を実行し、問題が発生したプログラムに接続する。mysqlaccess は、MySQL インストールディレクトリ下の bin ディレクトリにある。

  • バグのパッチを作成した場合、それを含める。ただし、当社はパッチだけを必要としているわけではない。パッチによって修正されるバグを示すテストケースなどの必要な情報が記載されていない場合、当社はそのパッチを使用しない。当社がパッチに関連する問題を見つける場合もあれば、パッチをまったく理解できない場合もある。そのような場合は、パッチを使用することはできない。

    パッチの目的を正確に確認することができない場合、当社はそのパッチを使用しない。この場合、テストケースが役立つことになる。発生する可能性があるすべての状況がパッチによって処理されることを示す必要がある。パッチが機能しないボーダーラインケースが見つかった場合(それがまれなケースでも)、そのパッチは役に立たない可能性がある。

  • 何がバグであるか、そのバグがなぜ発生するのか、そのバグが何に関連するのかを推測することは、通常、間違いである。MySQL チームでさえも、最初にデバッガを使用せずにそのようなことを推測して、バグの実際の原因を特定することはできない。

  • ユーザ自身で問題を解決しようとしたことを他のユーザがわかるように、リファレンスマニュアルやメールアーカイブを確認したことをバグレポートに記載する。

  • 解析エラーが発生した場合、構文を詳細に確認する必要がある。構文に問題が見つからなかった場合は、使用している構文が現在のバージョンの MySQL サーバでサポートされていない可能性が非常に高い。現在のバージョンを使用している場合、使用している構文が http://www.mysql.com/doc/ のマニュアルで扱われていなければ、そのクエリは MySQL サーバでサポートされていない。その場合は、自分で構文を実装するか、 に電子メールを送信して、その構文を実装するように依頼するしかない。

    使用している構文がマニュアルで扱われていても、古いバージョンの MySQL サーバを使用している場合は、MySQL の変更履歴で構文が実装された時期を確認する必要がある。この場合は、新しいバージョンの MySQL サーバにアップグレードする方法がある。 See 付録?D. MySQL Change History

  • データが壊れている点が問題である場合や、特定のテーブルにアクセスした際にエラーが発生した場合、myisamchk または CHECK TABLEREPAIR TABLE を使用して、まずテーブルをチェックしてから、修復を試みる必要がある。 See 章?4. データベース管理

  • テーブルが頻繁に壊れる場合、その問題が発生する状況と理由を特定する必要がある。この場合、mysql-data-directory/'hostname'.err ファイルに、発生した問題に関する情報が格納されていることがある。See 項4.10.1. 「エラーログ」。このファイル内の関連する情報をバグレポートに記載する。通常、更新の途中で mysqld が停止されない限り、mysqld によってテーブルが破壊されることはないmysqld が停止した原因が特定されれば、当社はその問題の解決策をはるかに簡単に提供することができる。 See 項A.1. 「問題の原因を突き止める方法」

  • 可能な場合、最新バージョンの MySQL サーバをダウンロードしてインストールし、これによって問題が解決されるかどうかを確認する。MySQL ソフトウェアのすべてのバージョンが詳細にテストされているため、問題なく動作するはずである。すべてにおいて最大限の下位互換性が確保されているため、MySQL のバージョンを問題なく切り替えることができると当社は確信している。 See 項2.2.4. 「使用すべき MySQL のバージョン」

サポート契約を結んでいるお客様は、他のユーザが同じ問題に遭遇しているかどうか(また、その問題が解決されているかどうか)を確認するために該当するメーリングリストにバグレポートを投稿するだけでなく、優先的に処理されるように にも投稿してください。

MyODBC におけるバグの報告については、項11.2.4. 「MyODBC に関する問題を報告する方法」 を参照してください。

一般的な問題に対する解決策については、付録?A. 問題と一般的なエラー を参照してください。

メーリングリストではなく、個人宛てに回答が送信された場合、問題の解決に役立った回答が他のユーザにも役立つように、回答を要約してメーリングリストに送信するのがエチケットであると思います。

1.7.1.4. メーリングリストで質問に回答する際のガイドライン

多数のユーザにとって興味深いと思われる回答については、質問した個人に直接返信するのではなく、メーリングリストに投稿することができます。その場合、元の投稿者以外のユーザにも役立つように、一般的な回答をするようにしてください。リストに投稿する際には、回答が前の回答と重複していないことを確認してください。

元のメッセージ全体を引用するのではなく、質問の重要な部分を回答に要約してください。

HTML モードがオンになっているブラウザからメールメッセージを投稿しないでください。多くのユーザはブラウザでメールを読みません。

1.7.2. IRC(インターネットリレーチャット)の MySQL コミュニティサポート

さまざまな MySQL メーリングリストに加え、IRCインターネットリレーチャット)にも経験豊富なコミュニティがあります。以下は、当社が現在把握している最もすぐれたネットワーク/チャネルです。

  • freenode(サーバについては、http://www.freenode.net/ を参照)

    • #mysql MySQL に関する質問が中心であるが、他のデータベースや SQL に関する質問も受け付けている。

    • #mysqlphp MySQL+PHP という一般的な組み合わせに関する質問。

    • #mysqlperl もう 1 つの一般的な組み合わせ、MySQL+Perl に関する質問。

  • EFnet(サーバについては、http://www.efnet.org/ を参照)

    • #mysql MySQL に関する質問。

IRC ネットワークに接続する IRC クライアントソフトウェアを探している場合は、X-Chathttp://www.xchat.org/)を参照してください。X-Chat(GPL ライセンス)は、Unix および Windows プラットフォームで使用することができます。

1.8. MySQL の標準への準拠

このセクションでは、MySQL と ANSI/ISO SQL 標準との関連を説明します。MySQL サーバには SQL 標準に対する多数の拡張機能があります。ここでは、それらの拡張機能と使用方法を説明します。また、MySQL サーバに不足している機能と、差異を解決する方法に関する情報も提供します。

当社の目標は、正当な理由なく、あらゆる用途に対して MySQL サーバの使いやすさを制限しないことです。考えられるすべての用途に対応する開発を行うリソースがそろっていなくても、新しい領域で MySQL サーバを使用しようとしているユーザを常に喜んで援助し、アドバイスを提供します。

製品に関する当社の主な目標の 1 つは、速度や信頼性を犠牲にすることなく、SQL-99 標準への準拠に向けて開発を続けることです。大部分のユーザにとって MySQL サーバが大幅に使いやすくなるのであれば、当社は SQL に対する拡張機能や SQL 以外の機能のサポートを積極的に追加します(MySQL サーバ 4.0 の新しい HANDLER インタフェースは、この方針の一例です。 See 項6.4.9. 「HANDLER 構文」。)

当社は、負荷が高い Web/ログの使用とミッションクリティカルな年中無休の使用の両方に対応するために、トランザクションデータベースと非トランザクションデータベースのサポートを継続します。

MySQL サーバは、小規模なコンピュータシステムで中規模のデータベース(1,000 万 ? 1 億レコード、または 1 テーブルあたり約 100 MB)を使用することを目的として最初から設計されました。テラバイト規模のデータベースでも適切に動作するとともに、ハンドヘルドデバイスや組み込み用途により適した小規模な MySQL をコンパイルできるように、MySQL サーバの拡張を続けます。MySQL サーバのコンパクトな設計によって、ソースツリーで競合することなく、これらのどちらの方向も実現することができます。

現時点では、リアルタイムのサポートは考えていません(ただし、レプリケーションサービスを使用して、すでに多くのことを実行することができます)。

データベースクラスタのサポートは、新しいストレージエンジンの実装によって 2004 年内に開始される予定です。

データベースサーバでの XML サポートの提供を考えています。

1.8.1. MySQL が準拠する標準

エントリレベルは SQL-92 です。ODBC レベルは 0 ? 3.51 です。

コードの速度と品質を犠牲にすることなく、SQL-99 標準を完全にサポートすることを目標としています。

1.8.2. ANSI モードでの MySQL の実行

--ansi または --sql-mode=ANSI オプションを指定して mysqld を開始すると、MySQL サーバの動作は次のように変わります。

  • || は、OR のシノニムではなく、文字列連結演算子になる。

  • "’ は、文字列引用符ではなく、MySQL サーバの ‘`’ 引用符のように識別子引用符として扱われる。‘`’ は、ANSI モードでも識別子の引用に使用することができる。つまり、文字列の引用に二重引用符を使用することはできない。二重引用符を使用すると、識別子として解釈されてしまうためである。

  • 関数名と ‘(’ の間にスペースをいくつでも配置することができる。これによって、すべての関数名が予約語として扱われる。そのため、予約語となっているデータベース名、テーブル名、またはカラム名にアクセスするには、それらの名前を引用符で囲む必要がある。たとえば、USER() 関数があるので、mysql データベース内の user テーブルの名前とそのテーブル内の User カラムの名前が予約語となるため、これらを引用符で囲まなければならない。

    SELECT "User" FROM mysql."user";
    
  • REAL は、DOUBLE のシノニムではなく、FLOAT のシノニムとなる。

  • デフォルトのトランザクション分離レベルは、SERIALIZABLE となる。 See 項6.7.6. 「SET TRANSACTION 構文」

  • フィールド一覧にない GROUP BY でフィールド/式を使用することができる。

ANSI モードでサーバを実行するのは、以下のオプションを指定してサーバを起動するのと同じことです。

--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY
--transaction-isolation=SERIALIZABLE

MySQL 4.1 では、次の 2 つのステートメントで同じ動作を実現することができます。

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET GLOBAL sql_mode =
  "REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY";

MySQL 4.1.1 では、sql_mode オプションを次のように使用することもできます。

SET GLOBAL sql_mode="ansi";

この場合、sql_mode 変数の値は、ANSI モードに関連するすべてのオプションに設定されます。結果を確認するには、以下を実行します。

mysql> SET GLOBAL sql_mode="ansi";
mysql> SELECT @@GLOBAL.sql_mode;
+---------------------------------------------------------------------------+
| @global.sql_mode                                                          |
+---------------------------------------------------------------------------+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY |
+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

1.8.3. SQL-92 標準に対する MySQL 拡張機能

MySQL サーバには、他の SQL データベースにはない拡張機能があります。それらの拡張機能を使用した場合、他の SQL サーバにコードを移植できなくなるので注意してください。場合によっては、MySQL 拡張機能を含むコードを記述しても、/*! ... */ 形式のコメントを使用することで移植することができます。その場合、MySQL サーバでは、他の MySQL ステートメントと同様にコメント内のコードが解析および実行されますが、他の SQL サーバでは拡張機能が無視されます。次に例を示します。

SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...

'!' の後ろにバージョン番号を追加すると、MySQL バージョンが、使用されているバージョン番号以降の場合にのみ、構文が実行されます。

CREATE /*!32302 TEMPORARY */ TABLE t (a INT);

つまり、バージョン 3.23.02 以降を使用している場合、MySQL サーバで TEMPORARY キーワードが使用されます。

以下は、MySQL 拡張機能の一覧です。

  • フィールド型 MEDIUMINTSETENUM、およびさまざまな BLOB および TEXT 型。

  • フィールド属性 AUTO_INCREMENTBINARYNULLUNSIGNED、および ZEROFILL

  • すべての文字列比較は、デフォルトでは大文字と小文字を区別せず、現在のキャラクタセット(デフォルトでは ISO-8859-1 Latin1)で決められたソート順で行われる。これを変更するには、BINARY 属性を指定してカラムを宣言するか、BINARY キャストを使用して、MySQL サーバホストで使用される ASCII の順序に従って比較が行われるようにする必要がある。

  • MySQL サーバでは、各データベースは MySQL データディレクトリ下のディレクトリに、データベース内のテーブルはデータベースディレクトリ内のファイル名にマップされる。

    これには、次のような意味がある。

    • ほとんどの Unix システムのようにファイル名で大文字と小文字が区別されるオペレーティングシステム上の MySQL サーバでは、データベース名およびテーブル名は大文字と小文字を区別する。 See 項6.1.3. 「名前におけるケース依存」

    • データベース名、テーブル名、インデックス名、カラム名、またはエイリアス名を数字で始めることができる(ただし、数字のみから成る名前を使用することはできない)。

    • 標準のシステムコマンドを使用して、テーブルのバックアップ、名前の変更、移動、削除、およびコピーを行うことができる。たとえば、テーブルの名前を変更するには、テーブルに対応する .MYD.MYI、および .frm ファイルの名前を変更する。

  • SQL ステートメントで、db_name.tbl_name 構文を使用して、さまざまなデータベース内のテーブルにアクセスすることができる。同様の機能を備えた SQL サーバもあるが、これはユーザスペースと呼ばれる。MySQL サーバでは、CREATE TABLE ralph.my_table...IN my_tablespace のようなテーブルスペースはサポートされない。

  • 数値カラムで LIKE を使用することができる。

  • SELECT ステートメントでの INTO OUTFILE および STRAIGHT_JOIN の使用。 See 項6.4.1. 「SELECT 構文」

  • SELECT ステートメントでの SQL_SMALL_RESULT オプション。

  • テーブルの結合方法に関する説明を取得する EXPLAIN SELECT

  • インデックス名、フィールドのプリフィックス上のインデックス、および CREATE TABLE ステートメントでの INDEX または KEY の使用。 See 項6.5.3. 「CREATE TABLE 構文」

  • CREATE TABLE での TEMPORARY または IF NOT EXISTS の使用。

  • list に複数の要素がある COUNT(DISTINCT list) の使用。

  • ALTER TABLE ステートメントでの CHANGE col_nameDROP col_nameDROP INDEXIGNORE、または RENAME の使用。 See 項6.5.4. 「ALTER TABLE 構文」

  • RENAME TABLE の使用。 See 項6.5.5. 「RENAME TABLE 構文」

  • ALTER TABLE ステートメントでの複数の ADDALTERDROP、または CHANGE 節の使用。

  • DROP TABLE でのキーワード IF EXISTS の使用。

  • 1 つの DROP TABLE ステートメントで複数のテーブルを破棄することができる。

  • UPDATE および DELETE ステートメントの ORDER BY および LIMIT 節。

  • INSERT INTO ... SET col_name = ... 構文。

  • INSERT および REPLACE ステートメントの DELAYED 節。

  • INSERTREPLACEDELETE、および UPDATE ステートメントの LOW_PRIORITY 節。

  • LOAD DATA INFILE の使用。多くの場合、この構文は Oracle の LOAD DATA INFILE と互換性がある。 See 項6.4.8. 「LOAD DATA INFILE 構文」

  • ANALYZE TABLECHECK TABLEOPTIMIZE TABLE、および REPAIR TABLE ステートメント。

  • SHOW ステートメント。 See 項4.6.8. 「SHOW 構文」

  • '’ だけでなく、‘"’ または ‘'’ で文字列を囲むことができる。

  • エスケープ文字 ‘\’ の使用。

  • SET ステートメント。 See 項5.5.6. 「SET 構文」

  • GROUP BY 部で、選択したすべてのカラムの名前を列挙する必要がない。これにより、ごく一部ではあるが、きわめて一般的なクエリのパフォーマンスが向上する。 See 項6.3.7. 「GROUP BY 節で使用する関数と修飾子」

  • GROUP BYASC および DESC を指定することができる。

  • 他の SQL 環境を使用していたユーザにわかりやすいように、MySQL サーバでは多数の関数のエイリアスがサポートされている。たとえば、すべての文字列関数で、標準の SQL 構文と ODBC 構文の両方がサポートされている。

  • MySQL サーバでは、C プログラミング言語のように、|| および && 演算子が論理 OR および AND を意味すると解釈される。MySQL サーバでは、||OR、および &&AND はシノニムである。このすぐれた構文のために、MySQL サーバでは、文字列の連結に標準 SQL-99 の || 演算子を使用することができない。代わりに、CONCAT() を使用する。CONCAT() には引数をいくつでも使用できるので、|| 演算子の使用を MySQL サーバに変換するのは簡単である。

  • CREATE DATABASE または DROP DATABASE。 See 項6.5.1. 「CREATE DATABASE 構文」

  • % 演算子は MOD() のシノニムである。したがって、N % MMOD(N,M) と同じである。% は、C プログラマを対象として、また PostgreSQL との互換性を確保するためにサポートされている。

  • =<><=<>=><<>><=>ANDOR、または LIKE 演算子を、SELECT ステートメントの FROM の左側のカラム比較で使用することができる。次に例を示す。

    mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
    
  • LAST_INSERT_ID() 関数。 See 項11.1.3.32. 「mysql_insert_id()

  • REGEXP および NOT REGEXP 拡張正規表現演算子。

  • 1 つまたは複数の引数を使用する CONCAT() または CHAR()(MySQL サーバでは、これらの関数は引数をいくつでも使用することができる)。

  • BIT_COUNT()CASEELT()FROM_DAYS()FORMAT()IF()PASSWORD()ENCRYPT()MD5()ENCODE()DECODE()PERIOD_ADD()PERIOD_DIFF()TO_DAYS()、または WEEKDAY() 関数。

  • 部分文字列を削除する TRIM() の使用。SQL-99 では、1 つの文字しか削除できない。

  • GROUP BY 関数 STD()BIT_OR()BIT_AND()BIT_XOR()、および GROUP_CONCAT()。 See 項6.3.7. 「GROUP BY 節で使用する関数と修飾子」

  • DELETE + INSERT の代わりの REPLACE の使用。 See 項6.4.7. 「REPLACE 構文」

  • FLUSHRESET、および DO ステートメント。

  • 次のように、:= を使用してステートメント内で変数を設定することができる。

    SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table;
    SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
    

1.8.4. MySQL と SQL-92 との違い

MySQL サーバを ANSI SQL 標準(SQL-92/SQL-99)および ODBC SQL 標準に準拠したものにすることを目標としていますが、以下のように、MySQL サーバが異なる動作を示すことがあります。

優先順位に従って並べられた、新しい拡張機能が MySQL サーバに追加される時期を示す一覧については、オンラインの MySQL TODO リスト(http://www.mysql.com/doc/en/TODO.html)を参照してください。これは、このマニュアルの TODO リストの最新版です。 See 項1.6. 「MySQL の今後(TODO)」

1.8.4.1. サブクエリ

MySQL バージョン 4.1 では、サブクエリと派生テーブル(名前のないビュー)がサポートされています。 See 項6.4.2. 「サブクエリ構文」

4.1 より前のバージョンの MySQL については、結合などの方法によって、ほとんどのサブクエリを記述し直すことができます。 See 項6.4.2.11. 「初期の MySQL バージョンに合わせたサブクエリの書き換え」

1.8.4.2. SELECT INTO TABLE

MySQL サーバでは、Sybase SQL 拡張機能 SELECT ... INTO TABLE ... はまだサポートされていません。代わりに、SQL-99 構文 INSERT INTO ... SELECT ... がサポートされています。これらは、基本的には同じです。 See 項6.4.3.1. 「INSERT ... SELECT 構文」

INSERT INTO tblTemp2 (fldID)
       SELECT tblTemp1.fldOrder_ID
       FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;

また、SELECT INTO OUTFILE... または CREATE TABLE ... SELECT を使用することもできます。

1.8.4.3. トランザクションとアトミックオペレーション

MySQL サーバ(バージョン 3.23-max およびすべてのバージョン 4.0 以降)では、InnoDB および BDB トランザクションストレージエンジンでトランザクションがサポートされています。InnoDB は、完全に ACID に準拠しています。 See 章?7. MySQL のテーブル型

MySQL サーバのその他の非トランザクションテーブル型(MyISAM など)は、``アトミックオペレーション''と呼ばれる別のデータ整合性のパラダイムに従います。トランザクションの観点では、MyISAM テーブルは事実上、常に AUTOCOMMIT=1 モードで動作すると言えます。アトミックオペレーションでは多くの場合、パフォーマンスの高さに値する整合性が確保されます。

両方のパラダイムをサポートする MySQL サーバでは、ユーザはアトミックオペレーションの速度を必要とするか、アプリケーションでトランザクション機能を使用する必要があるかを選択することができます。この選択は、テーブルごとに行うことができます。

ほとんどの場合、トランザクションテーブル型と非トランザクションテーブル型のどちらを選ぶかの決め手となるのはパフォーマンスです。トランザクションテーブルの場合、はるかに大きなメモリとディスク領域が必要で、CPU のオーバーヘッドも大きくなります。しかし、InnoDB のようなトランザクションテーブル型には特有の機能も多数あります。MySQL サーバのモジュール設計によって、このようなさまざまなストレージエンジンすべてを同時に使用することができるので、さまざまな要件に合わせて、あらゆる条件で最適なパフォーマンスを確保することが可能です。

しかし、MySQL サーバの機能を使用して、非トランザクションの MyISAM テーブルでも厳密な整合性を確保するにはどのようにすればよいのでしょうか。また、非トランザクションテーブルの機能はトランザクションテーブル型にどのように対抗できるのでしょうか。

  1. トランザクションパラダイムでは、重大な状況で COMMIT ではなく ROLLBACK の呼び出しに依存するようにアプリケーションが作成されている場合、トランザクションの方が便利である。また、トランザクションでは、完了していない更新や失敗した活動がデータベースにコミットされることはない。サーバには自動ロールバックを行う機会が与えられ、データベースは保護される。

    MySQL サーバでは、ほとんどの場合、更新前に簡単なチェックを組み込んだり、データベースの不整合をチェックして、不整合が発生した場合には自動的に修復または警告する簡単なスクリプトを実行したりすることで、発生する可能性がある問題を解決することができる。MySQL ログを使用したり、別のログを 1 つ追加したりするだけで、通常、データの整合性が失われることなく、完全にテーブルを修復することができる。

  2. ほとんどの場合、重要なトランザクション更新はアトミックな更新に記述し直すことができる。通常、トランザクションによって解決される整合性の問題はすべて、LOCK TABLES またはアトミックな更新を使用して解決することができる。これによって、サーバが自動的に停止するという、トランザクションデータベースシステムと共通する問題が回避される。

  3. サーバが停止すると、トランザクションシステムでもデータが失われる可能性がある。個々のシステムの違いは、データが失われる可能性がある時間がどれだけ短いかという点だけである。100% 安全なシステムはなく、``十分に安全'' なだけである。最も安全なトランザクションデータベースシステムと言われている Oracle でさえも、そのような状況ではデータが失われることがあると報告されている。

    MySQL サーバを安全に使用するには、トランザクションテーブルを使用するかどうかに関係なく、バックアップを作成し、バイナリログをオンにすればよいだけである。これにより、他のトランザクションデータベースシステムで可能なように、どのような状況からもリカバリすることができる。使用するデータベースシステムに関係なく、どのような場合でもバックアップを作成することが望ましいのは当然である。

トランザクションパラダイムには長所と短所があります。多数のユーザおよびアプリケーション開発者は、停止が発生する、または停止が必要な問題に関するコード化の容易さに頼っています。しかし、アトミックオペレーションのパラダイムに慣れていなかったり、トランザクションの方が詳しいという場合でも、非トランザクションテーブルの速度が、最も高速で最適に調整されたトランザクションテーブルの速度の 3 倍から 5 倍も速いという長所を考えてみてください。

整合性が最も重要な状況では、MySQL サーバは、非トランザクションテーブルでもトランザクションレベルの信頼性と整合性を提供します。LOCK TABLES を使用してテーブルをロックすると、整合性チェックが行われるまで、すべての更新が延期されます。読み取りロック(書き込みロックの逆)のみが設定されている場合、読み取りと挿入は引き続き行うことができます。新しく挿入したレコードは、読み取りがロックされているクライアントには、読み取りロックが解除されるまで表示されません。INSERT DELAYED を使用すると、ロックが解除されるまで挿入をローカルキューに入れることができ、クライアントは挿入が完了するまで待機する必要はありません。 See 項6.4.3.2. 「INSERT DELAYED 構文」

ここでいう ``アトミック'' とは、魔法のようなものではありません。個々の更新の実行中は、他のユーザがそれを妨害できないようにするとともに、自動ロールバック(あまり注意を払わなかった場合に、トランザクションテーブルで行われることがあります)が行われないようにすることができるというだけです。また、MySQL サーバでは、ダーティリードが行われることもありません。

非トランザクションテーブルを使用する際のテクニックは、以下のとおりです。

  • LOCK TABLES を使用して、通常はトランザクションを必要とするループをコード化することができる。そのため、実行中にレコードを更新するカーソルが不要である。

  • ROLLBACK を使用しないように、以下の方法を使用することができる。

    1. LOCK TABLES ... を使用して、アクセスするすべてのテーブルをロックする。

    2. 条件をテストする。

    3. すべてに問題がなければ、更新する。

    4. UNLOCK TABLES を使用して、ロックを解除する。

    これは通常、ロールバックが行われる可能性があるトランザクションを使用するよりも、はるかに速い方法である。ただし、更新の途中でスレッドが停止された場合は、この方法では対応することができない。その場合、すべてのロックが解除されるが、一部の更新が実行されていない可能性がある。

  • 関数を使用して、1 回の操作でレコードを更新することもできる。次のようなテクニックを使用すると、非常に効率的なアプリケーションを取得することができる。

    • 現在の値に関連してフィールドを変更する。

    • 実際に変更されたフィールドのみを更新する。

    たとえば、顧客情報に対して更新を行う場合、変更された顧客データのみを更新し、変更されたデータ、または変更されたデータに依存するデータが元のレコードと比較して変更されていないことだけをテストする。変更されたデータのテストは、UPDATE ステートメントで WHERE 節を使用して行われる。レコードが更新されなかった場合、''Some of the data you have changed has been changed by another user.'' というメッセージがクライアントに表示される。その場合、ウィンドウに元のレコードと新しいレコードを表示して、使用する必要がある顧客レコードのバージョンをユーザが決定できるようにする。

    これによって、カラムロックと類似しているが、現在の値に関連する値を使用して、カラムの一部のみが更新される点で、実際はカラムロックよりすぐれた機能が実現する。つまり、一般的な UPDATE ステートメントは次のようになる。

    UPDATE tablename SET pay_back=pay_back+125;
    
    UPDATE customer
      SET
        customer_date='current_date',
        address='new address',
        phone='new phone',
        money_he_owes_us=money_he_owes_us-125
      WHERE
        customer_id=id AND address='old address' AND phone='old phone';
    

    これは非常に効率的で、別のクライアントが pay_back または money_he_owes_us カラムの値を変更していても動作する。

  • 多くの場合、ユーザは、複数のテーブルの一意の識別子を管理するために ROLLBACKLOCK TABLES を使用していた。これは、AUTO_INCREMENT カラムおよび SQL 関数 LAST_INSERT_ID() または C API 関数 mysql_insert_id() を使用することで、はるかに効率的に処理することができる。 See 項11.1.3.32. 「mysql_insert_id()

    通常、行レベルのロックをコード化することができる。状況によっては実際にこれが必要なので、InnoDB テーブルでは行レベルのロックがサポートされている。MyISAM では、テーブルでフラグカラムを使用し、以下のようなことを実行することができる。

    UPDATE tbl_name SET row_flag=1 WHERE id=ID;
    

    レコードが見つかり、元のレコードで row_flag がすでに 1 でなくなっていた場合、MySQL は、影響を受けたレコードの数として 1 を返す。

    MySQL サーバでは前述のクエリが次のように変更されると考えることができる。

    UPDATE tbl_name SET row_flag=1 WHERE id=ID AND row_flag <> 1;
    

1.8.4.4. ストアドプロシージャとトリガ

ストアドプロシージャは、バージョン 5.0 開発ツリーで実装されます。 See 項2.3.4. 「開発ソースツリーからのインストール」

この試みは SQL-99 に基づくもので、Oracle PL/SQL に類似した(ただし、同じではありません)基本構文を使用します。これに加え、外部言語でフックする SQL-99 フレームワークも実装します。

ストアドプロシージャは、サーバでコンパイルし、格納することができる SQL コマンドのセットです。これが行われると、クライアントはクエリ全体の再発行を繰り返す必要がなく、ストアドプロシージャを参照することができます。その結果、クエリを一度解析するだけで済み、サーバとクライアント間で送信される情報が少なくなるので、全体的なパフォーマンスが向上します。また、サーバに関数のライブラリを作成することで、概念レベルを高めることもできます。ただし、サーバ側で行われる作業が増え、クライアント(アプリケーション)側で行われる作業が少なくなるので、ストアドプロシージャによってデータベースサーバシステムの負荷が高くなります。

トリガは、MySQL バージョン 5.1 で実装される予定です。トリガは、実質的にはストアドプロシージャの一種で、特定のイベントが発生すると呼び出されます。たとえば、トランザクションテーブルからレコードが削除されるたびにトリガされるストアドプロシージャや、すべてのトランザクションが削除されると、顧客テーブルから対応する顧客を自動的に削除するストアドプロシージャを設定することができます。

1.8.4.5. 外部キー

MySQL サーバ 3.23.44 以降では、CASCADEON DELETE、および ON UPDATE を含む外部キー制約のチェックが InnoDB テーブルでサポートされています。 See 項7.5.5.2. 「FOREIGN KEY 制約」

他のテーブル型については、MySQL サーバでは現在、CREATE TABLE コマンドで FOREIGN KEY 構文のみが解析されますが、この情報は使用/保存されません。近いうちに、この情報がテーブル仕様ファイルに保存され、mysqldump および ODBC によって取得できるように、この実装を拡張する予定です。さらにその後には、MyISAM テーブルについても外部キー制約を実装する予定です。

SQL の外部キーはテーブルの結合に使用されるのではなく、参照整合性(外部キー制約)のチェックと確保に使用されます。SELECT ステートメントを使用して複数のテーブルから結果を得るには、次のようにテーブルを結合します。

SELECT * FROM table1,table2 WHERE table1.id = table2.id;

See 項6.4.1.1. 「JOIN 構文」。 See 項3.6.6. 「外部キーの使用」

制約として使用する際、アプリケーションによって MyISAM テーブルに適切な順序でレコードが挿入される場合は、外部キーを使用する必要はありません。

MyISAM テーブルについては、ON DELETE が実装されていないという問題に対処するには、外部キーがあるテーブルからレコードを削除する際に適切な DELETE ステートメントをアプリケーションに追加します。実際、この方法は外部キーを使用する場合と同じくらい簡単で(場合によっては、この方が簡単です)、移植性はそれよりもはるかに高くなります。

MySQL サーバ 4.0 では、複数テーブルの削除を使用して、1 つのコマンドで多数のテーブルからレコードを削除することができます。 See 項6.4.5. 「DELETE 構文」

ON DELETE ... を含まない FOREIGN KEY 構文は多くの場合、自動 WHERE 節を生成する ODBC アプリケーションによって使用されます。

外部キーを誤って使用すると、深刻な問題が発生することがあるので注意してください。適切に使用した場合でも、外部キーのサポートは、参照整合性の問題を解決する上で役に立つことはあっても、重要な解決策にはなりません。

外部キーを使用するメリットは、以下のとおりです。

  • 関係が適切に設計されている場合、外部キー制約によって、プログラマがデータベースで不整合を引き起こすことが少なくなる。

  • 連鎖更新および削除を使用すると、クライアントコードを単純化することができる。

  • 適切に設計された外部キールールは、テーブル間の関係の記述に役立つ。

外部キーを使用するデメリットは、以下のとおりです。

  • キー関係を設計する上で犯しやすい間違いによって、循環ルール、連鎖削除の不適切な組み合わせなどの深刻な問題が生じることがある。

  • データベースレベルでの余分なチェックによって、パフォーマンスに影響が生じる。そのため、一部の主要な商用アプリケーションでは、アプリケーションレベルでこのロジックがコード化されている。

  • DBA にとって、個々のテーブルのバックアップやリストアが非常に困難になり、場合によっては不可能になるような複雑な関係のトポロジを作成することはめったにない。

1.8.4.6. ビュー

ビューは現在実装中で、MySQL サーババージョン 5.0 または 5.1 で実装されます。

これまで、MySQL サーバは、アプリケーション作成者がデータベースの使用を完全に制御することができるアプリケーションや Web システムで最も多く使用されてきました。しかし、時間の経過とともに用途は変わってきており、ビューを重要視するユーザが増えています。

名前のないビュー(派生テーブルSELECTFROM 節内のサブクエリ)は、バージョン 4.1 ですでに実装されています。

ビューは、1 つのテーブルのように一連の関係(テーブル)にユーザがアクセスできるようにし、ユーザのアクセスをそれのみに制限する場合に便利です。また、ビューを使用して、レコード(特定のテーブルのサブセット)へのアクセスを制限することもできます。MySQL サーバには高度な特権システムがあるので、カラムへのアクセスを制限する場合にはビューを使用する必要はありません。 See 項4.3. 「一般的なセキュリティ関連事項と MySQL アクセス制御システム」

多数の DBMS では、ビューに対する更新を行うことはできません。代わりに、個々のテーブルに対して更新を実行する必要があります。当社はビューの実装を設計する際に、理論的に更新可能なすべてのビューは実際にも更新可能でなければならないという、リレーショナルデータベースシステムに関する ``コッドのルール #6'' に SQL の範囲内で可能な限り準拠することを目標としています。

1.8.4.7. コメントの開始記号としての '--'

一部の他の SQL データベースでは、コメントを開始するために '--' が使用されます。MySQL サーバでは、コメント開始文字として ‘#’ が使用されます。また、C コメントスタイルの /* this is a comment */ を使用することもできます。 See 項6.1.6. 「コメント構文」

MySQL サーババージョン 3.23.3 以降では、'--' コメントスタイルを使用することができます。ただし、コメントの後にスペース(または、改行などの制御文字)が続く場合に限ります。これは、このコメントスタイルによって、!payment! の値を自動的に挿入する次のようなコードを使用した自動生成の SQL クエリで多数の問題が発生していたためです。

UPDATE tbl_name SET credit=credit-!payment!

payment の値が負数の場合、どうなるかを考えてみてください。SQL では 1--1 が有効なので、コメントを '--' で開始できるようにした場合の影響は重大です。

MySQL サーババージョン 3.23.3 以降でコメントのこの方法の実装を使用した場合、1-- This is a comment は実際に安全です。

もう 1 つの安全な機能は、mysql コマンドラインクライアントによって '--' で始まるすべての行が削除されるというものです。

以下の情報は、3.23.3 より前のバージョンの MySQL を実行している場合にのみ関連します。

テキストファイルの SQL プログラムに '--' コメントが含まれている場合、次のコマンドを使用する必要があります。

shell> replace " --" " #" < text-file-with-funny-comments.sql \
         | mysql database

通常の次のコマンドの代わりに、上記のコマンドを使用してください。

shell> mysql database < text-file-with-funny-comments.sql

また、コマンドファイルを ``その場で'' 編集して、'--' コメントを ‘#’ コメントに変更することもできます。

shell> replace " --" " #" -- text-file-with-funny-comments.sql

次のコマンドで元に戻してください。

shell> replace " #" " --" -- text-file-with-funny-comments.sql

1.8.5. MySQL における制約の処理

MySQL ではトランザクションテーブルとロールバックが有効でない非トランザクションテーブルの両方を使用することができるので、MySQL と他のデータベースとでは制約の処理が多少異なります。

エラー時にロールバックすることができない非トランザクションテーブルで多数のレコードを更新した場合の処理を実装しなければなりません。

基本的な概念は、検出可能なエラーをコンパイル時に生成し、受け取ったエラーから実行時にリカバリするというものです。ほとんどの場合にこれが実装されていますが、まだすべてについて実装されているわけではありません。 See 項1.6.4. 「近い将来に計画されている新機能」

MySQL における基本的なオプションは、途中でステートメントを中止するか、問題からリカバリするためにできる限りのことを行って、処理を続行するかです。

さまざまな種類の制約に関する問題を以下で説明します。

1.8.5.1. PRIMARY KEY/UNIQUE KEY 制約

通常、主キー、ユニークキー、または外部キー違反を引き起こすレコードの挿入/更新を行おうとすると、エラーが発生します。InnoDB のようなトランザクションストレージエンジンを使用している場合、MySQL ではトランザクションが自動的にロールバックされます。非トランザクションストレージエンジンを使用している場合、MySQL はエラーが発生したレコードで停止し、残りのレコードは未処理のままになります。

この問題を解決するために、MySQL では、キー違反が発生する可能性があるほとんどのコマンドに IGNORE ディレクティブのサポートを追加しました(INSERT IGNORE ... など)。この場合、キー違反は無視され、引き続き次のレコードが処理されます。MySQL における処理に関する情報を取得するには、mysql_info() API 関数を使用します。MySQL バージョン 4.1 では SHOW WARNINGS コマンドを使用します。 See 項11.1.3.30. 「mysql_info()。 See 項4.6.8.9. 「SHOW WARNINGS | ERRORS

現時点では、外部キーがサポートされているのは InnoDB テーブルのみです。See 項7.5.5.2. 「FOREIGN KEY 制約」MyISAM テーブルでの外部キーサポートは、MySQL 5.0 ソースツリーで実装される予定です。

1.8.5.2. NOT NULL および DEFAULT 値制約

非トランザクションテーブルを簡単に処理できるように、MySQL のすべてのフィールドにはデフォルト値が設定されています。

NOT NULL カラムにおける NULL や数値カラムにおける大きすぎる数値のように '正しくない' 値をカラムに挿入した場合、MySQL ではエラーを生成するのではなく、カラムを '最適可能値' に設定します。数値については、0、使用可能な最小値、または使用可能な最大値です。文字列については、空白文字列、またはカラム内で使用可能な最長文字列です。

つまり、NULL 値を使用することができないカラムに NULL を格納しようとすると、0 または ''(空白文字列)が代わりに格納されます。単一レコードの挿入については、この後者の動作を -DDONT_USE_DEFAULT_FIELDS コンパイルオプションを使用して変更することができます。See 項2.3.3. 「一般的な configure オプション」。この場合、非 NULL 値を必要とするすべてのカラムについて明示的に値を指定しない限り、INSERT ステートメントでエラーが生成されます。

前述のルールの理由は、クエリの実行が開始される前にこれらの条件をチェックできないためです。複数のレコードを更新した後で問題が発生した場合、テーブル型でサポートされていない可能性があるため、単にロールバックすることはできません。停止するというオプションは、この場合、更新が '未完了' のため、最悪のシナリオになる可能性があるので、適切ではありません。'できる限りのことを行って'、何も問題が発生していないものとして処理を続行する方が適切です。MySQL 5.0 では、自動フィールド変換に関する警告と、トランザクションテーブルのみを使用するステートメントで許可されていないフィールド割り当てが行われた場合にステートメントをロールバックすることができるオプションを提供することで、これを改善する予定です。

このことは、通常、フィールドの内容をチェックするために MySQL を使用するのではなく、アプリケーションでこれを処理しなければならないことを意味します。

1.8.5.3. ENUM および SET 制約

MySQL 4.x では、ENUM は実際の制約ではなく、特定の値セットのみを使用することができるフィールドを格納するためのより効率的な方法です。これは、NOT NULL が受け付けられないのと同じ理由によります。 See 項1.8.5.2. 「NOT NULL および DEFAULT 値制約」

ENUM フィールドに正しくない値を挿入した場合、予約された列挙数 0 に設定され、文字列コンテキストでは空白文字列として表示されます。 See 項6.2.3.3. 「ENUM 型」

SET フィールドに正しくない値を挿入した場合、その値は無視されます。 See 項6.2.3.4. 「SET 型」

1.8.6. MySQL の既知のエラーと設計上の問題

1.8.6.1. その後の MySQL バージョンで修正された 3.23 のエラー

以下の既知のエラー/バグは、MySQL 3.23 では修正されていません。これらの修正には、より深刻な他のバグを引き起こす可能性がある多数のコード変更が関連するためです。また、これらのバグは '非致命的' または '許容範囲' として分類されています。

  • 複数のテーブルに対して LOCK TABLE を実行した後、別のスレッドがテーブルをロックしようとしている間に同じ接続でそれらのテーブルのいずれかに対して DROP TABLE を実行した場合、デッドロックが発生することがある。ただし、関連するスレッドのすべてに KILL を実行することで、この問題を解決することができる。4.0.12 で修正済み。

  • テーブルのいずれかが空の場合、SELECT MAX(key_column) FROM t1,t2,t3...NULL を返す代わりに、カラムの最大値を返す。4.0.11 で修正済み。

  • ロックされた HEAP テーブルで、WHERE を含まない DELETE FROM heap_table が動作しない。

1.8.6.2. MySQL の未解決のバグと設計上の問題

以下の既知の問題は、優先して修正されます。

  • FLUSH TABLES WITH READ LOCK によって CREATE TABLE または COMMIT がブロックされず、テーブルおよびバイナリログの完全バックアップを実行すると、バイナリログの位置に関する問題が発生する。

  • BDB テーブルでの ANALYZE TABLE によって、mysqld を再実行するまでテーブルが使用できなくなることがある。この問題が発生した場合は、MySQL エラーファイルに次のようなエラーが生成される。

    001207 22:07:56  bdb:  log_flush: LSN past current end-of-log
    
  • MySQL では FROM 部でかっこを使用することができるが、自動的に無視される。エラーを生成しない理由は、クエリを自動的に生成する多くのクライアントで、不要な場合でも FROM 部にかっこが付け加えられるためである。

  • 同じクエリ内で多数の RIGHT JOINS を連結した場合や LEFT および RIGHT 結合を組み合わせた場合、LEFT 結合の前のテーブルまたは RIGHT 結合の前のテーブルについて NULL 行のみが生成されるので、正しい結果が得られないことがある。これは、FROM 部におけるかっこのサポートの追加と同時に、5.0 で修正する予定である。

  • マルチステートメントトランザクションを実行している BDB テーブルでは、それらのトランザクションすべてが完了するまで ALTER TABLE を実行しない(ほとんどの場合、トランザクションは無視される)。

  • ANALYZE TABLEOPTIMIZE TABLE、および REPAIR TABLE によって、INSERT DELAYED を使用しているテーブルで問題が発生することがある。

  • LOCK TABLE ... および FLUSH TABLES ... を実行しても、処理が進行中の未完了のトランザクションがテーブルにないとは限らない。

  • BDB テーブルを開くのに多少時間がかかる。データベースに多数の BDB テーブルがあるときに、-A オプションを使用していない場合や rehash を使用している場合、データベース上で mysql クライアントを使用するのに時間がかかる。これは、大きなテーブルキャッシュがある場合に特に顕著である。

  • レプリケーションではクエリレベルのログが使用される。つまり、マスタによって、実行されたクエリがバイナリログに書き込まれる。これは非常に速く、コンパクトで効率的なログ方法であり、ほとんどの場合に問題なく機能する。実際に発生した例を聞いたことはないが、データの変更が非決定論的、つまりクエリオプティマイザの判断で行われるようにクエリが設計されている場合(レプリケーションの外部でも、通常は適切な方法でない)、マスタおよびスレーブのデータが理論的に異なる可能性がある。たとえば、次のような場合である。

    • AUTO_INCREMENT カラムにゼロまたは NULL 値を挿入する CREATE ... SELECT または INSERT ... SELECT ステートメント。

    • ON DELETE CASCADE プロパティが設定された外部キーがあるテーブルからレコードを削除する場合の DELETE

    • 挿入されるデータに重複するキー値がある場合の REPLACE ... SELECTINSERT IGNORE ... SELECT

    これらのクエリすべてに決定論的順序を保証する ORDER BY 節がない場合のみである

    実際、たとえば、ORDER BY がない INSERT ... SELECT の場合、SELECT は、マスタおよびスレーブでオプティマイザによって行われる選択によっては、異なる順序でレコードを返すことがある(その結果、レコードに異なるランクが設定され、auto_increment カラムで異なる数を取得することになる)。マスタとスレーブでクエリが異なって最適化されるのは、以下の場合のみである。

    • 2 つのクエリによって使用されるファイルが、正確には同じでない。たとえば、OPTIMIZE TABLE がマスタテーブルでは実行されたが、スレーブテーブルでは実行されなかった場合などである(これを修正するために、MySQL 4.1.1 以降では、OPTIMIZEANALYZE、および REPAIR がバイナリログに書き込まれる)。

    • マスタとスレーブで異なるストレージエンジンにテーブルが格納されている(スレーブとマスタで異なるストレージエンジンを使用することができる。たとえば、スレーブの方が使用可能なディスク領域が少ない場合、マスタでは InnoDB を使用し、スレーブでは MyISAM を使用することができる)。

    • MySQL バッファのサイズ(key_buffer_size など)が、マスタとスレーブで異なる。

    • マスタとスレーブで異なる MySQL バージョンが実行されており、オプティマイザのコードがこれらのバージョン間で異なる。

    また、この問題は、mysqlbinlog|mysql によるデータベースのリストアにも影響を及ぼすことがある。

    あらゆるケースでこの問題を回避する最も簡単な方法は、このような非決定論的なクエリに ORDER BY 節を追加して、レコードが常に同じ順序で格納/変更されるようにすることである。今後の MySQL バージョンでは、必要に応じて自動的に ORDER BY 節が追加されるようにする予定である。

以下の既知の問題は、近いうちに修正されます。

  • テンポラリテーブルを使用して解決する必要があるクエリで RPAD 関数、または最終的に右側に空白を追加する他の文字列関数を使用した場合、すべての結果文字列で右側の空白が削除される。次に、このクエリの例を示す。

    SELECT RPAD(t1.field1, 50, ' ') AS f2, RPAD(t2.field2, 50, ' ') AS f1 FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinID ORDER BY t2.record;

    このバグの最終的な結果は、生成されるフィールドの右側の空白を取得できなくなることである。

    この動作は、すべてのバージョンの MySQL に見られる。

    この原因は、テンポラリテーブルとして最初に使用される HEAP テーブルで VARCHAR 型のカラムを処理できないことである。

    この動作は、4.1 シリーズのいずれかのリリースで修正される予定である。

  • テーブル定義ファイルの格納方法のために、テーブル名、カラム名、または列挙に文字 255(CHAR(255))を使用することができない。これは、新しいテーブル定義ファイル形式が導入されるバージョン 5.1 で修正される予定である。

  • SET CHARACTER SET を使用した場合、データベース名、テーブル名、およびカラム名で変換された文字を使用することができない。

  • LIKE ... ESCAPEESCAPE とともに _ または % を使用することができない。

  • DECIMAL 型のカラムにさまざまな形式(+01.00、1.00、01.00)で数字が格納されている場合、GROUP BY によって各値が異なる値として見なされることがある。

  • WHERE なしで DELETE FROM merge_table を使用すると、テーブルに対するマッピングのみが消去され、マップされたテーブルの内容は一切削除されない。

  • MIT-pthreads を使用した場合、別のディレクトリにサーバを構築することができない。これには MIT-pthreads の変更が必要なので、これを修正する予定はない。 See 項2.3.6. 「MIT-pthreads に関する注意事項」

  • GROUP BYORDER BY、または DISTINCTBLOB 値を ``確実に'' 使用することができない。これらの場合に BLOB 値を比較した場合、最初の max_sort_length バイト(デフォルトは 1024)のみが使用される。これは、mysqld-O max_sort_length オプションを使用して変更することができる。ほとんどの場合の回避策は、SELECT DISTINCT LEFT(blob,2048) FROM tbl_name のように部分文字列を使用することである。

  • BIGINT または DOUBLE で計算が実行される(通常はどちらの長さも 64 ビット)。取得する精度は関数によって異なる。一般的なルールとして、ビット関数は BIGINT 精度、IF および ELT()BIGINT または DOUBLE 精度、残りは DOUBLE 精度で実行される。ビットフィールド以外については、符号なしの長い値が 63 ビット(9223372036854775807)より大きい値に解決される場合、そのような値を使用しないようにする必要がある。MySQL サーバ 4.0 では、3.23 に比べて BIGINT の処理が向上している。

  • BLOB 型および TEXT 型のカラムを除くすべての文字列カラムで、取得時に後続のスペースすべてが自動的に削除される。CHAR 型の場合、これには問題はなく、SQL-92 に準拠した機能と見なすことができる。バグは、MySQL サーバで VARCHAR 型のカラムが同様に処理される点である。

  • 1 つのテーブルに ENUM 型および SET 型のカラムを 255 個までしか作成することができない。

  • MySQL では現在、MIN()MAX()、およびその他の集約関数において、ENUM 型と SET 型のカラムがセット内の文字列の相対的な位置ではなく、文字列値によって比較される。

  • mysqld_safe によって、mysqld から mysqld ログにすべてのメッセージがリダイレクトされる。これに関する 1 つの問題として、mysqladmin refresh を実行してログを閉じた後、もう一度開いた場合、stdout および stderr が引き続き元のログにリダイレクトされる点がある。--log を広範に使用する場合、'hostname'.log ではなく 'hostname'.err にログが記録されるように mysqld_safe を編集して、元のログを削除し、mysqladmin refresh を実行することで、元のログのスペースを簡単に解放できるようにする必要がある。

  • UPDATE ステートメントで、カラムが左から右に更新される。更新されたカラムを参照した場合、元の値ではなく更新された値を取得する。たとえば、次のようなコマンドがあるとする。

    mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
    

    この場合、KEY1 ではなく、2 によって更新される。

  • 1 つのクエリで複数のテンポラリテーブルを参照することができるが、特定のテンポラリテーブルを複数回参照することはできない。たとえば、次のクエリは動作しない。

    mysql> SELECT * FROM temporary_table, temporary_table AS t2;
    
  • RENAME が、TEMPORARY テーブル、または MERGE テーブル内で使用されているテーブルで動作しない。

  • 結合で '非表示の' カラムを使用している場合と使用していない場合とで、オプティマイザによって DISTINCT が異なって処理されることがある。結合では、非表示のカラムは結果の一部としてカウントされるが(表示されていない場合も同様)、通常のクエリでは、非表示のカラムは DISTINCT 比較に関連しない。DISTINCT を実行した場合も非表示のカラムが比較されないように、今後これを変更する予定である。

    この例は以下のとおりである。

    SELECT DISTINCT mp3id FROM band_downloads
           WHERE userid = 9 ORDER BY id DESC;
    

    および

    SELECT DISTINCT band_downloads.mp3id
           FROM band_downloads,band_mp3
           WHERE band_downloads.userid = 9
           AND band_mp3.id = band_downloads.mp3id
           ORDER BY band_downloads.id DESC;
    

    2 番目の例の場合、MySQL サーバ 3.23.x では、結果セットで 2 つの同じレコードを取得することがある(非表示の id カラムが異なる場合があるため)。

    この問題は、結果に ORDER BY カラムがないクエリのみで発生する。これは、SQL-92 では許可されていない。

  • MySQL サーバではトランザクションをサポートしないためにデータをロールバックすることができないテーブル型を使用することができるので、MySQL サーバと他の SQL サーバでは動作が多少異なる。これは単に、MySQL サーバでは SQL コマンドに対してロールバックが実行されないようにするためである。これは、アプリケーションでカラム値をチェックする必要があるときには多少不便な場合があるが、他の方法では非常に困難な最適化を MySQL サーバで実行することができるので、実質的には速度が大幅に向上する。

    カラムを正しくない値に設定した場合、ロールバックが行われる代わりに、カラムに取りうる値のうち最適な値が格納される。

    • 数値カラムに範囲外の値を格納しようとした場合、使用可能な最小値または最大値が代わりに格納される。

    • 数値カラムに数字以外で始まる文字列を格納しようとした場合、0 が格納される。

    • NULL 値を使用することができないカラムに NULL を格納しようとした場合、0 または ''(空白文字列)が代わりに格納される(ただし、この動作は、-DDONT_USE_DEFAULT_FIELDS コンパイルオプションを使用して変更することができる)。

    • MySQL では、DATE 型および DATETIME 型のカラムに正しくない日付値(2000-02-31 や 2000-02-00 など)を格納することができる。その考えは、日付を検証するのは SQL サーバの役目ではないというものである。MySQL で日付を格納し、同じ日付を正確に取得できる場合、その日付は格納される。日付がまったく正しくない(サーバで日付を格納することができない)場合は、特殊な日付値 0000-00-00 がカラムに格納される。

    • ENUM 型のカラムをサポートされていない値に設定した場合、エラー値である空白文字列に設定される。数値の場合は、0 に設定される。

    • SET 型のカラムをサポートされていない値に設定した場合、その値は無視される。

  • 空のセットを返すクエリで PROCEDURE を実行した場合、PROCEDURE によってカラムが変換されないことがある。

  • MERGE 型のテーブルを作成する際に、基になるテーブルの型に互換性があるかどうかがチェックされない。

  • MySQL サーバではまだ、NaN-Inf、および Inf 値を倍精度で処理することができない。これらを使用した場合、データをエクスポートおよびインポートしようとすると問題が発生する。中間的な解決策として、NaNNULL(可能な場合)、-Inf および Inf をそれぞれ使用可能な最小および最大倍精度値に変更する必要がある。

  • ALTER TABLE を使用して MERGE テーブルで使用されているテーブルに UNIQUE インデックスを追加した後、ALTER TABLE を使用して MERGE テーブルに通常のインデックスを追加すると、一意でない古いキーがテーブルに存在していた場合、テーブルでキーの順序が変わる。これは、重複キーをできるだけ早く検出できるように、ALTER TABLEUNIQUE キーを通常のキーの前に配置するためである。

以下は、MySQL の初期のバージョンにおける既知のバグです。

  • LOCK TABLES を使用してロックされている多数のテーブルのうちの 1 つのテーブルで DROP TABLE を実行した場合、ハングスレッドを取得することがある。

  • 以下の場合、コアダンプを取得することがある。

    • 遅延挿入ハンドラがテーブルへの挿入を保留している場合。

    • WRITE を含む LOCK table

    • FLUSH TABLES

  • MySQL サーババージョン 3.23.2 より前は、同じキーで WHERE を使用してキーを更新した UPDATE でエラーが発生することがあった。これは、そのキーがレコードの検索に使用され、同じレコードが複数回検出されることがあったためである。次に例を示す。

    UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;
    

    回避策は次のとおりである。

    mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;
    

    これが機能するのは、MySQL サーバでは WHERE 節内の式にインデックスが使用されないためである。

  • MySQL サーババージョン 3.23 より前は、すべての数値型が固定小数点型フィールドとして扱われていた。そのため、固定小数点型フィールドの小数部桁数を指定しなければならなかった。すべての結果が、正確な小数部桁数で返されていた。

プラットフォーム固有のバグについては、コンパイルおよび移植に関するセクションを参照してください。 See 項2.3. 「MySQL ソースディストリビューションのインストール」。 See 付録?E. 他システムへの移植


This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

アダルトレンタルサーバー