MySQL/MariaDB 用户帐户名中允许使用哪些字符?

Sch*_*ddi 10 mysql mariadb users

我不清楚哪些字符可以出现在 MySQL/MariaDB 用户帐户名中,哪些是非法的。我已阅读MySQL 文档中的第6.3.1“用户名和密码”。本节包含有关字符编码和最大名称长度的信息,但没有说明可以在帐户名称中使用的字符是否受到限制(或者我可能错过了那部分?)。

那么,MySQL/MariaDB 中有哪些特殊字符不能用在用户帐户名中?例如,控制字符(如换行符)或通配符(如星号)是否是非法字符?

jyn*_*nus 7

用户名存储在 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 '',
Run Code Online (Sandbox Code Playgroud)

这意味着,对于我的版本,用户名可以介于 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)
Run Code Online (Sandbox Code Playgroud)

检查系统中的类型,我想它可能会根据版本/供应商的不同而改变,或者在未来/过去会有所不同。