第5章:数据库管理 / 5.8. MySQL用户账户管理 / 5.8.1. MySQL用户名和密码

用用户名和客户端或主机定义MySQL账户,用户可以根据这些名称来连接服务器。账户也有密码。MySQL和操作系统使用用户名和密码的方式有几处区别:

·         MySQL用于鉴定目的用户名与WindowsUnix使用的用户名(登录名)没有关系。在Unix中,大多数MySQL客户端默认试图使用当前Unix的用户名作为MySQL用户名来登录,但这样只是为了方便。 默认值可以很容易被覆盖,因为客户端程序允许用-u--user选项来指定用户名。因为这表示任何人可以试图使用任何用户名来连接服务器,除非所有MySQL账户有密码,否则你不能使数据库保持安全。通过为没有密码的账户指定用户名,任何人能够成功连接服务器。

·         MySQL用户名最大客达16字符长。这样可以限制MySQL服务器和客户端之间的硬编码,并且防止通过修改mysql数据库中表的定义来偷窃密码。

:应绝对不要以任何方式修改mysql数据库中的任何表,只能运行MySQL分发中专为此目的提供的脚本。将MySQL系统表重新定义为其它方式会导致未定义的(和不支持的!)行为

操作系统用户名与MySQL用户名完全不相关,甚至最大长度可能不同。例如, Unix用户名限制为8个字符。

·         MySQL密码与登录到你的操作系统的密码没有关系。不需要将你用来登录WindowsUnix机器的密码和你用来访问该机器上的MySQL服务器的密码关联起来。

·         MySQL的加密密码使用自己的算法。该加密算法不同于Unix登录过程使用的算法。MySQL密码加密与PASSWORD()SQL函数的方法相同。Unix密码加密与ENCRYPT()SQL函数的方法相同。PASSWORD()ENCRYPT()函数的描述参见12.9.2节,“加密函数”。从版本4.1 起,MySQL使用更强的鉴定方法,同以前的版本相比可以在连接过程中提供更好的密码保护。即使TCP/IP包被截取或mysql数据库被捕获也很安全。(在前面的版本中,即使密码以加密形式保存到user表中,仍可以通过加密密码值来连接MySQL服务器)

当安装MySQL时,授权表装载时有一系列初使账户。这些账户的名称和访问权限见2.9.3节,“使初始MySQL账户安全”,其中还讨论了如何未这些账户赋予密码。因此,你一般应使用GRANTREVOKE语句来设置、修改和移除MySQL账户。参见13.5.1.3节,“GRANT和REVOKE语法”

当用命令行客户端连接MySQL服务器时,你应为想要使用的账户指定用户名和密码:

shell> mysql --user=monty --password=guess db_name

如果你想用较短的选项,命令应为:

shell> mysql -u monty -pguess db_name

-p选项和后面的密码值之间绝对不能有空格。参见5.7.4节,“与MySQL服务器连接”

前面的命令包括命令行中的密码值,会很危险。参见5.8.6节,“使你的密码安全”。要想避免,指定--password-p选项后面不跟任何密码值:

shell> mysql --user=monty --password db_name
shell> mysql -u monty -p db_name

然后客户端程序输出提示符并等待你输入密码。(在这些示例中,db_name并不为密码,因为用空格将它同前面的密码项隔离开了)

在一些系统中,MySQL用来提示输入密码的库调用自动将密码限制到8个字符。这是系统库的问题,而不是MySQL的问题。MySQL本身并不限制密码的长度。要解决该问题,将MySQL密码改为8个字符和更少字符的值,或将密码放入选项文件中。