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.