Esta excepción apareció recientemente al dockerizar una aplicación PHP 5.6 antigua que usa MySQL como RDBMS. Inicialmente, configurar PHP para que funcionara con las extensiones adecuadas ya era un dolor de cabeza porque algunas extensiones eran antiguas y necesitaban compilarse desde el código fuente, etc., así que cuando finalmente resolví el problema de las extensiones, apareció el error SQLSTATE[HY000] [2054] en mi pantalla
Este problema aparece básicamente porque estás usando una aplicación que usa un conjunto de caracteres predeterminado que ya no es el predeterminado en MySQL 8. En mi caso, mi aplicación PHP 5.6 se conectaba a la base de datos usando utf8 y por defecto en MySQL 8, el conjunto de caracteres predeterminado se establece automáticamente en utf8mb4 y, por lo tanto, la excepción aparece porque la aplicación cliente no entiende lo que significa el servidor y arroja el error mencionado.
En este artículo, te propondré 2 posibles soluciones para este problema al intentar conectarte a tu base de datos.
Solución #1 (Ajustar el conjunto de caracteres predeterminado)
De forma predeterminada, en MySQL 8, el conjunto de caracteres predeterminado se establece en utf8mb4, que generalmente no es compatible con clientes antiguos, como en mi caso con un proyecto Symfony 1.4. Si desea proporcionar compatibilidad con MySQL 8, deberá ajustar el conjunto de caracteres predeterminado de su instancia de MySQL a través del archivo de configuración. Busque el archivo de configuración de MySQL (generalmente ubicado en /etc/my.cnf
o /etc/mysql/conf.d/my.cnf
) y agregue las siguientes configuraciones en las secciones mencionadas:
# /etc/mysql/conf.d/my.cnf
[mysqld]
collation-server = utf8_unicode_ci
character-set-server = utf8
# Otherwise the following exception will be thrown: the server requested authentication method unknown to the client
default_authentication_plugin= mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
Después de actualizar el archivo de configuración de MySQL, asegúrese de actualizar el complemento de autenticación utilizado para sus usuarios. En este caso, estoy usando el usuario raíz para conectarme a la base de datos, así que actualizaré específicamente solo a ese usuario:
--- Update the authentication plugin of the user e.g for root with the password ---
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourRootPassword';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourRootPassword';
ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'yourRootPassword';
--- Then flush the privileges ---
FLUSH PRIVILEGES;
Finalmente, reinicie el servicio mysql (o el contenedor en caso de que esté usando la ventana acoplable):
sudo service mysql restart
¡Y eso es! Su aplicación debería poder conectarse ahora suponiendo que el conjunto de caracteres anterior era UTF-8.
Solución #2 (Degradar MySQL)
Esta fue la solución para mí ya que no era posible usar MySQL 8 en el proyecto anterior, así que simplemente tuve que usar MySQL 5.7 en su lugar. La degradación eliminó automáticamente cada una de las nuevas excepciones que nunca vi al configurar el proyecto como de costumbre. El RDBMS original para este proyecto era MySQL 5.7, por lo que resolvió todas las incompatibilidades.
¡Que te diviertas❤️!
Conviertete en un programador más sociable