When updating or changing your MySQL user password, you might encounter an error saying the password
column is unknown.
Consider the following example UPDATE
statement:
UPDATE mysql.user
SET Password = PASSWORD('root')
WHERE User = 'root';
The above statement might produce the following error:
ERROR 1054 (42S22): Unknown column 'Password' in 'field list'
This is because MySQL version 5.7 changed the Password
column into authentication_string
.
If your MySQL server version is between 5.7.0 to 5.7.5, then you can change the Password
column into authentication_string
column as shown below:
UPDATE mysql.user
SET authentication_string = PASSWORD('root')
WHERE User = 'root';
-- Query OK, 0 rows affected (0.01 sec)
The above statement should work, but rather than using an UPDATE
statement, there’s a different statement that’s recommended to change MySQL user passwords.
Furthermore, the PASSWORD()
function has been deprecated since MySQL version > 5.7.5, so you might fail to execute the UPDATE
statement for MySQL version 5.7.6 and above.
To change your MySQL user’s password, it’s recommended to use the ALTER USER
statement.
The syntax is as shown below:
ALTER USER user IDENTIFIED BY 'password_here';
For example, to change the root
user password with abcd
, use the following statement:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'abcd';
-- Query OK, 0 rows affected (0.01 sec)
You need to add the user Host
part as shown below (using @'localhost'
or @'%'
)
You can find the Host
information of your user by using the following SELECT
query:
SELECT User, Host FROM mysql.user;
The returned result set would be similar as shown below:
+------------------+-----------+
| User | Host |
+------------------+-----------+
| nathan | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
Once you find the Host
name of your user, just add it to the ALTER USER
statement as shown above.
To conclude, the ALTER USER
statement is the recommended statement to modify MySQL user account according to MySQL documentation.
Using the UPDATE
statement and the PASSWORD()
function is an old way of changing MySQL user passwords that no longer work in the latest stable MySQL version.
Если при попытке восстановления пароля пользователя root (как например в этой статье) вы вдруг получаете что-то вроде: ERROR 1054 (42S22): Unknown column ‘password’ in ‘field list’… ниже описано решение этой проблемы 🙂
Сначала выберем базу данных:
mysql>use mysql;
Затем просмотрим таблицы в ней:
mysql>show tables;
Смотрим в таблицу с пользовательскими данными user:
mysql> describe user; +------------------------+-----------------------------------+------+-----+-----------------------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+-----------------------------------+------+-----+-----------------------+-------+ | Host | char(60) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Reload_priv | enum('N','Y') | NO | | N | | | Shutdown_priv | enum('N','Y') | NO | | N | | | Process_priv | enum('N','Y') | NO | | N | | | File_priv | enum('N','Y') | NO | | N | | | Grant_priv | enum('N','Y') | NO | | N | | | References_priv | enum('N','Y') | NO | | N | | | Index_priv | enum('N','Y') | NO | | N | | | Alter_priv | enum('N','Y') | NO | | N | | | Show_db_priv | enum('N','Y') | NO | | N | | | Super_priv | enum('N','Y') | NO | | N | | | Create_tmp_table_priv | enum('N','Y') | NO | | N | | | Lock_tables_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | | Repl_slave_priv | enum('N','Y') | NO | | N | | | Repl_client_priv | enum('N','Y') | NO | | N | | | Create_view_priv | enum('N','Y') | NO | | N | | | Show_view_priv | enum('N','Y') | NO | | N | | | Create_routine_priv | enum('N','Y') | NO | | N | | | Alter_routine_priv | enum('N','Y') | NO | | N | | | Create_user_priv | enum('N','Y') | NO | | N | | | Event_priv | enum('N','Y') | NO | | N | | | Trigger_priv | enum('N','Y') | NO | | N | | | Create_tablespace_priv | enum('N','Y') | NO | | N | | | ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | | | ssl_cipher | blob | NO | | NULL | | | x509_issuer | blob | NO | | NULL | | | x509_subject | blob | NO | | NULL | | | max_questions | int(11) unsigned | NO | | 0 | | | max_updates | int(11) unsigned | NO | | 0 | | | max_connections | int(11) unsigned | NO | | 0 | | | max_user_connections | int(11) unsigned | NO | | 0 | | | plugin | char(64) | NO | | mysql_native_password | | | authentication_string | text | YES | | NULL | | | password_expired | enum('N','Y') | NO | | N | | | password_last_changed | timestamp | YES | | NULL | | | password_lifetime | smallint(5) unsigned | YES | | NULL | | | account_locked | enum('N','Y') | NO | | N | | +------------------------+-----------------------------------+------+-----+-----------------------+-------+ 45 rows in set (0.00 sec)
И…почему-то поля ‘password’ у нас нет… Но вот что мы делаем в данном случае:
mysql>update user set authentication_string=password('pa$$w0rd') where user='root';
Вот и всё!
In MySQL 5.7, the password field in mysql.user table field was removed, now the field name is ‘authentication_string’.
First choose the database:
mysql>use mysql;
And then show the tables:
mysql>show tables;
You will find the user table, now let’s see its fields:
mysql> describe user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | NO | | mysql_native_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint(5) unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.00 sec)
Surprise!There is no field named ‘password’, the password field is named ‘ authentication_string’. So, just do this:
update user set authentication_string=password('1111') where user='root';
Now, everything will be ok.
Compared to MySQL 5.6, the changes are quite extensive: What’s New in MySQL 5.7
Дата: 25.11.2013
Автор: Даниил Каменский , dkamenskiy (at) yandex (dot) ru
При использовании ряда CMS (например, DLE, vBulletin и др.) временами возникает ошибка mysql с номером 1054.
Текст ошибки Unknown column ‘ИМЯ_СТОЛБЦА’ in ‘field list’ в переводе означает «Неизвестный столбец ‘ИМЯ_СТОЛБЦА’ в списке полей.«. Такая ошибка возникает в том случае, если попытаться выбрать (запрос вида select) или изменить (запрос вида update) данные из столбца, которого не существует. Ошибка чаще всего возникает из-за стoронних модулей. Перечислим несколько возможных причин:
- установлен модуль, расчитанный на более новую версию CMS, чем используемая;
- при установке модуля не выполнились операции изменения структуры таблиц;
- после установки сторонних модулей выполнено обновление системы, которое привело к изменению структуры таблиц; при этом модуль не был обновлен на совместимый;
- Из резервной копии восстановлена более старая база данных, а файлы сайта остались в новой версии.
Пример №1:
Имеется таблица сотрудников подразделения.
Поля: id, фамилия, имя, отчество, год рождения, наличие высшего образования.
create table if not exists employee
(
`id` int(11) NOT NULL auto_increment primary key,
`surname` varchar(255) not null,
`name` varchar(255) not null,
`patronymic` varchar(255) not null,
`year_of_birth` int unsigned default 0,
`higher_education` tinyint unsigned default 0
) ENGINE=MyISAM;
Если обратиться к этой таблице с запросом на выборку несуществующего поля, например пола сотрудника по фамилии Власенко, то результатом будет вышеуказанная ошибка:
mysql> select sex from employee where surname=’Власенко’;
ERROR 1054 (42S22): Unknown column ‘sex’ in ‘field list’
Пример №2:
Воспользуемся той же таблицей из примера 1. Если попытаться указать мужской пол у сотрудника по имени Власенко (выяснилось его имя и стало ясно, что это мужчина), то результатом будет та же ошибка:
mysql> update employee set sex=1 where surname=’Власенко’;
ERROR 1054 (42S22): Unknown column ‘sex’ in ‘field list’
Способы борьбы
Самый корректный способ борьбы в устранении причины ошибки. Например, все обновления сайта рекомендуем выполнять сначала на копии сайта и если ошибок нет, то повторять на рабочем сайте. Если при обновлении возникла ошибка, следует найти способ сделать обновление корректно с учетом версий сторонних модулей.
Если по каким-то причинам корректно избежать ошибки не получилось, можно прибегнуть к симптоматическому лечению, которое состоит в простом добавлении недостающих полей в таблицу.
Запрос на добавление:
ALTER TABLE employee ADD COLUMN sex ENUM(‘male’, ‘female’) DEFAULT ‘female’
Что в переводе означает «Изменить таблицу employee, добавив столбец `пол`, назначив ему тип перечисление(мужской/женский) по умолчанию мужской».
При таком добавлении столбца необходимо учитывать, что у всех записей в таблице в столбце sex появится значение по умолчанию. Если добавлять такой столбец как пол (который не может быть равен null и обязательно присутствует у каждого человека), то просто необходимо сразу же
после этого прописать нужное значение во все записи в таблице. В данном случае с добавлением столбца «пол» нужно будет поменять значение на male у всех сотрудников мужского пола.
Трудности могут возникнуть из-за того, что часто нужно самостоятельно определять тип добавляемого столбца.
Примеры:
a) Запрос:
SELECT faqname, faqparent, displayorder, volatile FROM faq where product
IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
Ответ сервера:
Invalid SQL: SELECT faqname, faqparent, displayorder, volatile FROM faq where
product IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
MySQL Error: Unknown column ‘faqname’ in ‘field list’
Error Number: 1054
Отсутствует столбец faqname, добавим его. Логика подсказывает, что если имя — то это скорее всего символы, а не целое число или тип datetime. Количество символов заранее, конечно, неизвестно, но редко имя бывает больше чем 255 символов. Поэтому добавим столбец faqname с указанием типа varchar(255):
ALTER TABLE faq ADD faqname varchar(255)
б) Запроc:
UPDATE dle_usergroups set group_name=‘Журналисты’, allow_html=‘0’ WHERE id=‘3’;
Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name=’Журналисты’, allow_html=’0′ WHERE id=’3′;
MySQL Error: Unknown column ‘allow_html’ in ‘field list’
Error Number: 1054
Отсутствует столбец allow_html, добавим его. Смотрим на то значение, которое туда пытается вставить запрос, видим 0. Скорее всего этот столбец может принимать два значения — разрешить/не разрешить (1 или 0), то есть однобайтное целое число вполне подойдёт. Поэтому добавим столбец allow_html с указанием типа tinyint:
ALTER TABLE faq ADD allow_html tinyint
Таким образом можно составить шаблон для «лечения» таких проблем: ALTER TABLE [a] ADD [b] [c];, где
a — имя таблицы, откуда выбираются (или где обновляются) данные;
b — имя столбца, который нужно добавить;
c — тип данных.
Примеры (во всех примерах идёт работа с таблицей dle_usergroups):
1) Запрос:
UPDATE dle_usergroups set group_name=‘Журналисты’, allow_html=‘0’ WHERE id=‘3’;
Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name=’Журналисты’, allow_html=’0′ WHERE id=’3′;
MySQL Error: Unknown column ‘allow_html’ in ‘field list’
Error Number: 1054
Решение:
a=dle_usergroups, b=allow_html, c=tinyint, то есть
ALTER TABLE dle_usergroups ADD allow_html tinyint
Для того, чтобы выполнить исправляющий ошибку запрос, необходимо воспользоваться каким-либо mysql-клиентом. В стандартной поставке mysql всегда идёт консольный клиент с названием mysql (в windows mysql.exe). Для того, чтобы подключиться к mysql выполните команду
mysql -hНАЗВАНИЕ_ХОСТА -uИМЯ_ПОЛЬЗОВАТЕЛЯ -pПАРОЛЬ ИМЯ_БАЗЫ_ДАННЫХ,
после чего введите необходимый запрос и точку с запятой после него в появившейся командной строке.
В том случае, если работа происходит на чужом сервере (например, арендуется хостинг) и нет возможности воспользоваться mysql-клиентом из командной строки (не всегда хостеры представляют такую возможность), можно воспользоваться тем инструментом, который предоставляет хостер — например, phpMyAdmin, и в нём ввести нужный sql-запрос.
В то же время наиболее подходящий инструмент для работы с mysql — это MySQL Workbench — разработка создателей mysql с достаточно удобным пользовательским интерфейсом.
Если же нет возможности подключиться к mysql напрямую (например из-за ограничений файрвола), то в ряде случаев возможно удалённо подключиться к MySQL-серверу через SSH-туннель.
2) Запрос:
UPDATE dle_usergroups set group_name=‘Журналисты’, allow_subscribe=‘0’ WHERE id=‘3’;
Ответ сервера:
Invalid SQL: UPDATE dle_usergroups set group_name=’Журналисты’, allow_subscribe=’0′ WHERE id=’3′;
MySQL Error: Unknown column ‘allow_subscribe’ in ‘field list’
Error Number: 1054
Решение:
a=dle_usergroups, b=allow_subscribe, c=tinyint, то есть
ALTER TABLE dle_usergroups ADD allow_subscribe tinyint
3) Запрос:
SELECT faqname, faqparent, displayorder, volatile FROM faq where product IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
Oтвет сервера:
InvalidSQL: SELECT faqname, faqparent, displayorder, volatile FROM faq where product IN (», ‘vbulletin’, ‘watermark’, ‘cyb_sfa’, ‘access_post_and_days’);
MySQL Error: Unknown column ‘faqname’ in ‘field list’
Error Number: 1054
Решение:
a= faq, b=faqname, c=varchar(255), то есть
ALTER TABLE faq ADD faqname varchar(255)
Результат
В результате добавления необходимого поля ошибка должна исчезнуть. Однако, существует вероятность того, что в структуре таблиц не хватало несколько столбцов: в этом случае ошибка повторится с указанием другого имени столбца, для которого потребуется повторить процедуру. Помните, что добавление незаполненных столбцов угаданного типа не всегда будет соответствовать задуманной логике приложения и может нарушить часть функциональности.
Источник: webew.ru
Дата публикации: 25.11.2013
© Все права на данную статью принадлежат порталу SQLInfo.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в бумажных изданиях допускается только с разрешения редакции.
Posted by FatDBA on November 27, 2017
mysql> update mysql.user set Password = PASSWORD(‘mysql’) where user =’root’;
ERROR 1054 (42S22): Unknown column ‘Password’ in ‘field list’
WHY ??????
This was working all good in other instances of MySQL where i had earlier versions installed, why not this one – Puzzled, Perplexed!
Let me check version information of this instance.
mysql> show variables like "%version%";
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| innodb_version | 5.7.20 |
| protocol_version | 10 |
| slave_type_conversions | |
| tls_version | TLSv1,TLSv1.1 |
| version | 5.7.20 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+------------------------------+
8 rows in set (0.01 sec)
Well, starting from MySQL version 5.7 the PASSWORD column from mysql.user table has been removed and now replaced with ‘authentication_string’.
So the all new syntax for this password reset would be like this …
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
mysql> update user set authentication_string=password(‘mysql’) where user=’root’;
Query OK, 2 rows affected, 1 warning (0.00 sec)
Rows matched: 3 Changed: 2 Warnings: 1
Hope That Helps
Prashant Dixit
This entry was posted on November 27, 2017 at 2:06 PM and is filed under Basics.
Tagged: mysql. You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, or trackback from your own site.
Today, in the last step of installing MySQL, there was an error when setting the password for MySQL!!
ERROR 1054 (42S22): Unknown column ‘password’ in ‘field list’
Do along while just know, can change password through password-free login way.
First of all, let’s go to the mysql master configuration file and add a command as follows:
skip-grant-tables
After adding, save and restart MySQL service.
systemctl restart mysqld
If you log into mysql database again, you can log in directly without password, and then change the password again, as follows:
update mysql.user set authentication_string=password('password') where user='account' ;
Log out of mysql service and log in again!!
The next problem is that the MySQL password has suddenly expired, with an error message:
ERROR 1862 (HY000): Your password has expired. To log in you must change
Error 1862(HY000): Your password has expired. Login must change it to use a client that supports expired passwords.
The solution is as follows:
Login to MySQL service in passpassage-free mode, as mentioned above, simply add a line of skip-gran-tables parameter to the configuration file, and then view the root user’s details after you enter MySQL.
# mysql -u root -p
> use mysql
> select * from mysql.user where user='root' G
See the following information:
*************************** 1. row ***************************
Host: localhost
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *AC241830FFDDC8943AB31CBD47D758E79F7953EA
password_expired: N
password_last_changed: 2015-11-11 16:52:49
password_lifetime: NULL
account_locked: N
1 row in set (0.00 sec)
Change password_EXPIRED to unexpired
> update user set password_expired='N' where user='root';
> flush privileges;
> quit
Finally, annotate the skip-Grant-tables parameter, restart MySQL service, and log in MySQL service again!!
Read More:
The MySQL way of changing password is SET PASSWORD
SET PASSWORD FOR 'root' = PASSWORD('new_password');
see MySQL 5.7 Reference Manual / … / SET PASSWORD Syntax
The SET PASSWORD statement assigns a password to a MySQL user
account, specified as either a cleartext (unencrypted) or encrypted
value:'auth_string' represents a cleartext password. 'hash_string' represents an encrypted password.
The accepted answer from Rahul shows how to update password with DML
statement.
update user set authentication_string=password('XXXX') where user='root';
Warning: that’s not the official and supported way. It can cause troubles, if you don’t know what you are doing. Don’t forget FLUSH PRIVILEGES
.
For most operations, like creating a user, changing its privileges, or
changing its password, you will want to use the high-level statements.
Not only they are easier to use and they are compatible with a larger
number of MySQL versions, but they will also prevent you from making
mistakes (of course, remember to setup the “NO_AUTO_CREATE_USER“ sql
mode). They even usually work nicely in a MyISAM-hostile environment
like a Galera cluster.
Stop using FLUSH PRIVILEGES
Please use GRANT
, REVOKE
, SET PASSWORD
, or RENAME USER
and not direct DML statements.
Update: SET PASSWORD … = PASSWORD(‘auth_string’) syntax is deprecated as of MySQL 5.7.6 and will be removed in a future MySQL release.