web-dev-qa-db-ja.com

MySQL / MariaDBのユーザーアカウント名に使用できるのはどの文字ですか?

MySQL/MariaDBのユーザーアカウント名で使用できる文字、および不正な文字はわかりません。 MySQLドキュメントのセクション 6.3.1 "ユーザー名とパスワード" を読みました。このセクションには、文字エンコードと名前の最大長に関する情報が含まれていますが、アカウント名で使用できる文字が制限されているかどうかは記載されていません(またはおそらくその部分を逃しましたか?)。

では、MySQL/MariaDBでユーザーアカウント名に使用できない特別な文字はありますか?たとえば、制御文字(改行など)またはワイルドカード文字(アスタリスクなど)は無効な文字ですか?

4
Schmuddi

ユーザー名はmysql.userテーブルに保存されます。私のシステム(mariadb 10.3)では、そのテーブルはutf8文字セットのCHAR(80)として作成されます。次のコマンドを実行して、自分のものを確認できます。

MariaDB [(none)]> SHOW CREATE TABLE mysql.user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '',

つまり、私のバージョンでは、ユーザー名は0から80文字で、有効なutf8文字列ですが、基本的な多言語プレーン(3バイト文字のみ)の外側にはできません。

したがって、制御文字とワイルドカード文字は有効ですが、たとえば絵文字は無効です。

MariaDB [(none)]> CREATE USER 'a*b';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> CREATE USER 'a
    '> b';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> CREATE USER '????';
ERROR 1470 (HY000): String '????' is too long for user name (should be no longer than 80)

MariaDB [(none)]> CREATE USER 'Robert\'); DROP TABLE Students;-- ';
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> SELECT user FROM mysql.user;
+----------------------------------+
| user                             |
+----------------------------------+
| Robert'); DROP TABLE Students;-- |
| a
b                              |
| a*b                              |
| root                             |
| root                             |
| root                             |
| root                             |
+----------------------------------+
7 rows in set (0.000 sec)

システムのタイプを確認してください。バージョン/ベンダーによって異なる場合や、将来/過去の場合とは異なる場合があります。

5
jynus

ユーザー名に関するMariaDBのドキュメント は、特に明確ではありませんが、MySQLの場合よりも少し役立ちます。

(少なくとも)ハイフンとワイルドカード文字を使用する場合は、引用符で囲む必要があると記載されています。

ユーザー名とホスト名は、引用符で囲まないか、二重引用符( ")または単一引用符( ')を使用して文字列として引用するか、バッククォート(`)を使用して識別子として引用します。特殊文字(ハイフンなど)を使用する場合は、引用符を使用する必要があります。またはワイルドカード文字引用符を付ける場合は、ユーザー名とホスト名を別々に引用符で囲む必要があります(例: 'user_name' @ 'Host_name')。

1
dave559