如果是本机登录,可以不用加 -h localhost -p , 因为第一个登录认证是不需要密码的,默认也是localhost,而第二条则用在远程登录上,如果密码忘记了,可以用本地用户登录后,再修改

解决方案 »

  1.   

    谢谢,
    上面还有一个问题没完。
    我刚刚改的密码怎么是 2e782c85379a326e 了?难道是加密后的?
      

  2.   

    1:use  mysql;  
    update  user  set  password  =password('12345')  where  host='%' and user='root';
    select host,user,password from user;
    结果是:
    -------------------------------------------------|
    |host      |     user     |     password         |
    |------------------------------------------------|
    |localhost |     root     |     null             |
    | %        |     root     |     2e782c85379a326e |
    -------------------------------------------------| 以上你的操作是完全正确的,
    显示的 2e78.......  是经过 PASSWORD() 函数加密后的密文,
    (localhost='%' ??  应该是笔误吧! )
    但是你在执行下面的语句之前,你还应该执行一句 FLUSH PRIVILEGES;mysql>mysql -h localhost -u root -p
    enter password:12345
    ERROR 1045:Access denied for user:'[email protected]'语句  FLUSH PRIVILEGES 是用于通知 MySQL 服务程序刷新授权表信息的
    {
      为什么要使用 FLUSH PRIVILEGES ,这一语句呢? 
      这是因为当 MySQL 启动时,它会读取一下用户授权表信息,并将它加载到内存中
      当运行以后,有用户登录时,它将直接从内存中查找匹配的授权信息,  而如果你使用 SQL 数据操纵语句来对用户授权表进行修改时,
      MySQL 并不会注意到授权表信息的变化,
      只有发出 FLUSH PRIVILEGES 语句,
      才能使 MySQL 重新加载授权表信息,
      而如果你使用 GRANT ,则授权信息的更改就立即被 MySQL 接受,
      因而也不再需要 执行 FLUSH PRIVILEGES 语句了.
    }
    2:在你执行了 FLUSH PRIVILEGES 语句后,再执行
    mysql -h localhost -u root -p12345很不幸的事发生,你会依然得到一个出错信息
    ERROR 1045:Access denied for user:'[email protected]'这是为什么呢,呵呵,因为你登录时的用户信息为
    Host = localhost
    User = root
    Password = 12345你的登录信息匹配的是第一条记录,
    而该条记录中密码是空,所以你登录时应该使用
    mysql -h localhost -u root或者使用
    mysql -h 192.168.0.1 -u root -p12345
    使你的授权匹配第二条记录{
      为什么 mysql -h localhost -u root 匹配的是用户授权表中的第一条记录
      而不是第二条 Host = %, User = root, Password = 12345 的记录呢??  :)
      这是由于 MySQL 在启动时读入用户授权表后,
      在内存中对其进行了一次排序,
      用户授权表 
       +----------+--------------+----------------------+
       |host      |     user     |     password         | 
       +----------+--------------+----------------------+
       |localhost |     root     |     null             |
       | %        |     root     |     2e782c85379a326e | 
       +----------+--------------+----------------------+
      排序后的结果仍是 
       +----------+--------------+----------------------+
       |host      |     user     |     password         | 
       +----------+--------------+----------------------+
       |localhost |     root     |     null             |
       | %        |     root     |     2e782c85379a326e | 
       +----------+--------------+----------------------+
       然后在你以  mysql -h localhost -u root 登录时,它会首先检查 Host 字段,
       你的 Host = localhost ,所以就匹配 第一个用户信息!
       用户授权表的排序规则 \ 当用户授权表中出现多个 Host = localhsot 的记录,
       mysql -h localhost -u root  会匹配那一个呢?????
       能不能你自己回答一下??
       
    }
      

  3.   

    回第一个问题:  %是针对远程登陆的,而localhost才是针对本地登陆。
    第2个问题:没听懂:)
      

  4.   

    1:
    % 并不是表示远程登陆,
      它表示的是通配符,
      192.168.0.%   通配 192.168.0.0 ~  192.168.0.255
    2:  
    如果用户表是这样的
    +----------+----------+----------------------+
    |host      | user     |     password         | 
    +----------+----------+----------------------+
    |localhost |          |                      |
    |localhost | root     |                      | 
    |localhost | root1    |                      |
    +----------+----------+----------------------+现在这样登录
    mysql -h localhost -u tttt    它匹配哪一个用户??
    mysql -h localhost -u root    它匹配哪一个用户??