Documentation Home
MySQL 8.0 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 36.1Mb
PDF (A4) - 36.2Mb


このページは機械翻訳したものです。

6.2.4 アカウント名の指定

MySQL アカウント名は、ユーザー名とホスト名で構成されます。これにより、異なるホストから接続する同じユーザー名を持つユーザーに対して個別のアカウントを作成できます。 このセクションでは、特別な値やワイルドカードルールなど、アカウント名の構文について説明します。

ほとんどの点で、アカウント名は MySQL のロール名と似ていますが、セクション6.2.5「ロール名の指定」 で説明されているいくつかの違いがあります。

アカウント名は、CREATE USERGRANTSET PASSWORD などの SQL ステートメントに表示され、次のルールに従います:

  • アカウント名の構文は'user_name'@'host_name'です。

  • @'host_name'部分はオプションです。 ユーザー名のみで構成されるアカウント名は、'user_name'@'%' と同等です。 たとえば、'me''me'@'%' と同等です。

  • ユーザー名およびホスト名は、それらが引用符なしの識別子として有効な場合、引用する必要はありません。 user_name 文字列に特殊文字 (スペースや - など) が含まれている場合、または host_name 文字列に特殊文字やワイルドカード文字 (.% など) が含まれている場合は、引用符を使用する必要があります。 たとえば、アカウント名'test-user'@'%.com'では、ユーザー名とホスト名の両方の部分に引用符が必要です。

  • バックティック (`)、一重引用符 (') または二重引用符 (") を使用して、ユーザー名とホスト名を識別子または文字列として引用符で囲みます。 文字列および識別子として引用符で囲む方法のガイドラインについては、セクション9.1.1「文字列リテラル」およびセクション9.2「スキーマオブジェクト名」を参照してください。

  • ユーザー名およびホスト名の部分が引用符で囲まれる場合、別々に囲んでください。 つまり、'me@localhost'ではなく'me'@'localhost'と記述します。 後者は、実際には'me@localhost'@'%'と同等です。

  • CURRENT_USER または CURRENT_USER() 関数への参照は、現行クライアントのユーザー名およびホスト名の文字を指定することと同等です。

MySQL では、ユーザー名とホスト名の部分に別々のカラムを使用して、アカウント名が mysql システムデータベースの付与テーブルに格納されます:

  • user テーブルにはアカウントごとに 1 行が格納されます。 User および Host カラムはユーザー名およびホスト名を格納します。 このテーブルには、アカウントが持つグローバル権限も指定されます。

  • ほかの付与テーブルには、データベースおよびデータベース内のオブジェクトに対してアカウントが持つ権限が示されます。 これらのテーブルにはアカウント名を格納するための User および Host カラムがあります。 これらのテーブルの各行は、同じ User および Host の値を持つ user テーブル内のアカウントに関連付けられています。

  • アクセスチェックの目的で、ユーザー値の比較では大/小文字が区別されます。 ホスト値の比較では、大文字と小文字は区別されません。

付与テーブルに格納されているユーザー名とホスト名のプロパティー (最大長など) の詳細は、付与テーブルのスコープカラムのプロパティ を参照してください。

ユーザー名およびホスト名は、次に示すような特殊な値が使用されたりワイルドカード規則が適用されたりします。

アカウント名のユーザー名部分は、受信接続試行のユーザー名と文字どおり一致する空白以外の値、または任意のユーザー名と一致する空白の値 (空の文字列) です。 ブランクのユーザー名を持つアカウントは匿名ユーザーです。 SQL ステートメントで匿名ユーザーを指定するには、''@'localhost' のように引用符で囲んだ空のユーザー名部分を使用します。

アカウント名のホスト名部分は多くの形式を持つことができ、ワイルドカードが許可されます。

  • ホスト値はホスト名または IP アドレス (IPv4 または IPv6) とすることができます。 'localhost' という名前はローカルホストを示します。 IP アドレス '127.0.0.1' は IPv4 ループバックインタフェースを示します。 IP アドレス '::1' は、IPv6 ループバックインタフェースを示します。

  • % および_のワイルドカード文字は、ホスト名または IP アドレスの値に使用できます。 これらは LIKE 演算子で実行されるパターンマッチング演算と同じ意味を持ちます。 たとえば、'%'のホスト値は任意のホスト名に一致しますが、'%.mysql.com'の値は mysql.com ドメインの任意のホストに一致します。'198.51.100.%'は、1 つの 98.51.100 クラス C ネットワーク内の任意のホストに一致します。

    IP ワイルドカード値はホスト値で許可されているため (たとえば、サブネット上のすべてのホストに一致する'198.51.100.%'など)、ホストに 198.51.100.somewhere.com という名前を付けてこの機能を利用しようとする可能性があります。 このような試行を行うために、MySQL では、数字とドットで始まるホスト名の照合は実行されません。 たとえば、ホストの名前が 1.2.example.com の場合、その名前はアカウント名のホスト部分と一致しません。 IP ワイルドカード値は、ホスト名でなく IP アドレスのみと一致することができます。

  • IPv4 アドレスとして指定されたホスト値の場合、ネットマスクを指定して、ネットワーク番号に使用するアドレスビット数を示すことができます。 ネットマスク表記は IPv6 アドレスについては使用できません。

    構文は host_ip/netmask です。 例:

    CREATE USER 'david'@'198.51.100.0/255.255.255.0';

    これにより david は、次の条件が true となる IP アドレス client_ip を持つすべてのクライアントホストから接続できます。

    client_ip & netmask = host_ip

    つまり、次のような CREATE USER ステートメントがあるとします。

    client_ip & 255.255.255.0 = 198.51.100.0

    この条件を満たす IP アドレスの範囲は、198.51.100.0 から 198.51.100.255 です。

    ネットマスクは通常、1 に設定されたビットから始まり、0 に設定されたビットが続きます。 例:

    • 198.0.0.0/255.0.0.0: 198 のクラス A ネットワーク上のすべてのホスト

    • 198.51.0.0/255.255.0.0: 198.51 のクラス B ネットワーク上のすべてのホスト

    • 198.51.100.0/255.255.255.0: 198.51.100 のクラス C ネットワーク上のすべてのホスト

    • 198.51.100.1: この特定の IP アドレスを持つホストのみ

  • MySQL 8.0.23 では、IPv4 アドレスとして指定されたホスト値は、198.51.100.44/24 などの CIDR 表記法を使用して書き込むことができます。

サーバーは、クライアントホスト名または IP アドレス用のシステム DNS リゾルバによって返された値を使用して、アカウント名のホスト値の突き合わせをクライアントホストに対して実行します。 アカウントのホスト値がネットマスク表記法を使用して指定されている場合を除き、サーバーは、IP アドレスとして指定されたアカウントのホスト値に対しても、この比較を文字列一致として実行します。 つまり、DNS によって使用されるのと同じ形式でアカウントホスト値を指定しなければならないということを意味します。 留意するべき問題の例を次に示します。

  • ローカルネットワーク上のホストの完全修飾名が host1.example.com だとします。 DNS がこのホストの名前参照を host1.example.com として返す場合、アカウントホスト値にこの名前を使用します。 DNS が host1 のみを返す場合は、かわりに host1 を使用します。

  • DNS が特定のホストの IP アドレスを 198.51.100.2 として返す場合、198.51.100.2 のアカウントホスト値と一致しますが、198.051.100.2 とは一致しません。 同様に、198.51.100.% のようなアカウントホストパターンに一致しますが、198.051.100.% には一致しません。

このような問題を回避するには、DNS がホスト名とアドレスを返す形式を確認することをお薦めします。 MySQL アカウント名には、同じ形式の値を使用します。