MySQL xác định người dùng bằng CẢ tên người dùng và máy chủ. Khi MySQL thực hiện xác thực lúc đăng nhập, MySQL trước tiên sẽ tìm kiếm một tên máy chủ phù hợp chính xác. Nếu nó không tìm thấy kết quả phù hợp chính xác, thì nó sẽ tìm một máy chủ chứa ký tự đại diện '%'.
Khi bạn thực hiện GRANT ... TO [email protected]
, MySQL đã tạo một người dùng mới (không có mật khẩu, vì không có IDENTIFIED BY
được đưa ra trong tuyên bố.
Sau đó, điều gì đã xảy ra, khi bạn cố gắng đăng nhập bằng myuser
từ localhost, mysqld đã cố gắng tìm một mục khớp với 'myuser'@'localhost'
trong bảng mysql.user và nó đã tìm thấy nó. Và phiên có các đặc quyền được chỉ định cho người dùng đó.
(Nói chính xác hơn một chút, mysqld không thực sự nhìn vào nội dung của bảng mysql.user, nó thực sự nhìn vào cấu trúc trong bộ nhớ, được điền từ bảng khi nó được xây dựng. Việc xây dựng lại cấu trúc bộ nhớ được kích hoạt bởi câu lệnh GRANT, REVOKE hoặc FLUSH PRIVILEGES.)
Điều gì đã xảy ra TRƯỚC KHI bạn thêm người dùng mới đó, mysqld đang tìm kiếm một kết quả khớp chính xác về người dùng và tên máy chủ, nhưng không tìm thấy. Nhưng nó đã tìm thấy một mục nhập có ký tự đại diện '%', vì vậy nó khớp với mục đó, vì vậy phiên có tất cả các đặc quyền được cấp cho người dùng 'myuser' @ '%'.
Hai người dùng 'u'@'%'
và 'u'@'localhost'
tách biệt và khác biệt với nhau. Các đặc quyền phải được cấp cho từng người dùng riêng lẻ. Mọi đặc quyền được cấp cho 'u'@'%'
CHỈ áp dụng cho người dùng đó và KHÔNG áp dụng cho 'u'@'localhost'
.