Seguimiento del problema de consulta vacía al actualizar de MySQL 8.0.26 a 8.0.32

Un sistema de negocio experimentó fallos al migrar de MySQL 8.0.26 a GreatSQL 8.0.32-24, donde ciertas consultas no devolvían resultados. Las pruebas confirmaron que el probelma persiste en MySQL 8.0.32.

Esta vulnerabilidad fue corregida en GreatSQL 8.0.32-25

Información de versiones

greatsql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.32-24 |
+-----------+
1 fila en conjunto (0.00 seg)


Sentencias de creación de tabla

greatsql> SHOW CREATE TABLE tabla_estudiante;
CREATE TABLE `tabla_estudiante` (
  `identificador` int NOT NULL AUTO_INCREMENT,
  `nombre` varchar(255) NOT NULL,
  `edad` int NOT NULL,
  PRIMARY KEY (`identificador`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


Datos de la tabla

greatsql> SELECT * FROM tabla_estudiante;
+-------------+--------+------+
| identificador | nombre | edad |
+-------------+--------+------+
|           1 | abc    |   10 |
|           2 | Tom    |   20 |
+-------------+--------+------+
2 filas en conjunto (0.08 seg)


Pruebas de consulta

greatsql> SELECT * FROM (SELECT * FROM tabla_estudiante UNION SELECT * FROM tabla_estudiante) vista WHERE nombre='Tom';
Conjunto vacío, 2 advertencias (0.00 seg)

greatsql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------+
| Level   | Code | Message                                                                 |
+---------+------+-------------------------------------------------------------------------+
| Warning | 1300 | No se puede convertir la cadena '\xE6\xB1\xA4\xE5\xA7\x86' de utf8mb4 a binaria |
| Warning | 1300 | No se puede convertir la cadena '\xE6\xB1\xA4\xE5\xA7\x86' de utf8mb4 a binaria |
+---------+------+-------------------------------------------------------------------------+
2 filas en conjunto (0.00 seg)

greatsql> SELECT * FROM (SELECT * FROM tabla_estudiante UNION SELECT * FROM tabla_estudiante) vista;
+-------------+--------+------+
| identificador | nombre | edad |
+-------------+--------+------+
|           1 | abc    |   10 |
|           2 | Tom    |   20 |
+-------------+--------+------+
2 filas en conjunto (0.00 seg)

greatsql> SELECT * FROM (SELECT * FROM tabla_estudiante UNION SELECT * FROM tabla_estudiante) vista WHERE nombre='abc';
+-------------+--------+------+
| identificador | nombre | edad |
+-------------+--------+------+
|           1 | abc    |   10 |
+-------------+--------+------+
1 fila en conjunto (0.00 seg)


Al ejecutar consultas en vistas con condiciones en idioma nativo se generan advertencias de conversión de codificación. Los registros se muestran correctamente al aplicar filtros en caracteres ASCII.

Investigación en la documentación oficial reveló coincidencias con los siguientes casos: https://bugs.mysql.com/bug.php?id=110228https://bugs.mysql.com/bug.php?id=110955

El bug afecta la optimización de consultas con operadores UNION en MySQL 8.0.32, causando errores de conversión al filtrar campos de texto. La solución oficial incluye deshabilitar la optimizcaión de condiciones derivadas:

SET OPTIMIZER_SWITCH="DERIVED_CONDITION_PUSHDOWN=OFF";

Método de solución

Opción 1: Desactivar la optimización a nivel de sesión

greatsql> SET OPTIMIZER_SWITCH='DERIVED_CONDITION_PUSHDOWN=OFF';
Consulta OK, 0 filas afectadas (0.00 seg)

greatsql> SELECT * FROM (SELECT * FROM tabla_estudiante UNION SELECT * FROM tabla_estudiante) vista WHERE nombre='Tom';
+-------------+--------+------+
| identificador | nombre | edad |
+-------------+--------+------+
|           2 | Tom    |   20 |
+-------------+--------+------+
1 fila en conjunto (0.00 seg)


Opción 2: Usar hint para desactivar la optimización en consultas específicas

greatsql> SET OPTIMIZER_SWITCH='DERIVED_CONDITION_PUSHDOWN=ON';
Consulta OK, 0 filas afectadas (0.00 seg)

greatsql> SELECT * FROM (SELECT * FROM tabla_estudiante UNION SELECT * FROM tabla_estudiante) vista WHERE nombre='Tom';
Conjunto vacío, 2 advertencias (0.00 seg)

greatsql> SELECT /*+ NO_DERIVED_CONDITION_PUSHDOWN(vista) */ * FROM (SELECT * FROM tabla_estudiante UNION SELECT * FROM tabla_estudiante) vista WHERE nombre='Tom';
+-------------+--------+------+
| identificador | nombre | edad |
+-------------+--------+------+
|           2 | Tom    |   20 |
+-------------+--------+------+
1 fila en conjunto (0.00 seg)


Características de GreatSQL

GreatSQL es un sistema de base de datos de código abierto diseñado para aplicaciones financieras, ofreciendo alta rendimiento, confiabilidad, facilidad de uso y seguridad. Puede reemplazar a MySQL o Percona Server en entornos de producción, siendo completamente gratuito y compatible con las versiones mencionadas.

Enlaces relacionados: Comunidad GreatSQL Gitee GitHub Bilibili

Comunidad GreatSQL:

Convocatoria para artículos en el blog de la comunidad: https://greatsql.cn/thread-100-1-1.html

Grupo de discusión técnico:

WeChat: Escanee para agregar al asistente de la comunidad GreatSQL y envíe "unirse al grupo" como mensaje de verificación.

Etiquetas: MySQL 8.0.32 GreatSQL UNION UTF-8 encoding Query Optimization

Publicado el 8-29 04:54