The world's most popular open source database
Los siguientes problemas son conocidos y arreglarlos es de alta prioridad:
Si compara un valor NULL con una subconsulta utilizando
ALL/ANY/SOME y la subconsulta retorna un conjunto vacío, la comparación
podría devolver el resultado no estándard de NULL en vez de
TRUE o FALSE. Esto será arreglado en MySQL 5.1.
La optimización de las subconsultas para IN no es tan efectiva como para
=.
Aún cuando utilice lower_case_table_names=2 (que permite a MySQL recordar
la diferencia entre mayúsculas y minúsculas utilizada en los nombres de las bases de datos y las
tablas), MySQL no la recuerda en los nombres de bases de datos al utilizar la función
DATABASE() o en los diversos registro (en sistemas no sensibles a
mayúsculas/minúsculas).
Eliminar una restricción de FOREIGN KEY no funciona en una replicación
porque la restricción puede tener otro nombre en el esclavo.
REPLACE (y LOAD DATA
con la opción REPLACE) no dispara a ON DELETE CASCADE.
DISTINCT con ORDER BY no funciona dentro
de GROUP_CONCAT() si no utiliza todas y únicamente aquellas columnas que están
en la lista de DISTINCT.
Si un usuario tiene una transacción ejecutándose durante mucho tiempo y otro
usuario elimina una tabla que es actualizada durante la transacción, hay una pequeña
posibilidad de que el registro binario contenga el comando DROP TABLE
antes de que dicha tabla sea utilizada en la transacción. Planeamos arreglar esto haciendo
que el comando DROP TABLE espera a que la tabla no sea utilizada en ninguna
transacción.
Cuando se inserta un valor de entero grande (entre 263 y 264–1) en una columna decimal o de cadena de caracteres, se inserta con un valor negativo porque el número es evaluado en un contexto de entero con signo.
FLUSH TABLES WITH READ LOCK no bloquea los
COMMIT si el servidor se está ejecutando sin registro binario, lo que
puede causar un problema (de consistencia entre tablas) cuando se hace una copia de seguridad
completa.
ANALYZE TABLE en una tabla BDB
puede hacer que en algunos casos la tabla quede inutilizable hasta que reinicie
mysqld. Si esto ocurre, busque los errores similares a este en el archivo
de error de MySQL:
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
No ejecute ALTER TABLE en una tabla BDB
en la que usted esté ejecutando transacciones de varias sentencias hasta que todas
esas transacciones hayan sido completadas. (La transacción podría ser ignorada.)
ANALYZE TABLE, OPTIMIZE
TABLE, y REPAIR TABLE podría causar problemas en tablas para las que
usted esté utilizando INSERT DELAYED.
Realizar LOCK TABLE ... y
FLUSH TABLES ... no garantiza que no haya una transacción a medio ejecutar
en progreso en la tabla.
Las tablas BDB son relativamente lentas de abrir.
Si usted tiene muchas tablas BDB en una base de datos,
un cliente mysql podría tardar mucho en estar listo si no está
utilizando la opción -A o sí está utilizando
rehash. Esto es especialmente notable cuando tiene una cache de tablas
grande.
La replicación utiliza registro a nivel de consulta: El maestro escribe las sentencias ejecutadas al registro binario. Este es un método de registro muy rápido, compacto, y eficiente que trabaja de manera perfecta en la mayor parte de los casos.
Es posible que los datos en el maestro y el esclavo difieran si una consulta se diseña de manera que la modificación de los datos sea no-determinista (generalmente no es una práctica recomendada, incluso sin hablar de replicación).
Por ejemplo:
Las sentencias CREATE ... SELECT o INSERT
... SELECT que inserten valores cero o NULL en una columna
AUTO_INCREMENT.
DELETE, si usted está borrando registros de una tabla que tiene
claves foráneas con propiedad ON DELETE
CASCADE.
REPLACE ... SELECT, INSERT
IGNORE ... SELECT si tiene valores de clave duplicados en los datos insertados.
Si y únicamente si las sentencias precedentes no tienen una clausula
ORDER BY garantizado un orden
determinista.
Por ejemplo, en INSERT ... SELECT sin un
ORDER BY, el SELECT podría retornar registros en orden
diferente (lo que resulta en una fila que termina teniendo diferente rango, es decir,
obteniendo un número diferente en la columna AUTO_INCREMENT),
dependiendo de las elecciones hechas por los optimizadores en el maestro y el esclavo.
Una consulta está optimizada de manera diferente en el maestro y el esclavo sólo sí:
Los archivos utilizados en las dos consultas no son exactamente los mismos; por ejemplo
se ejecutó OPTIMIZE TABLE en las tablas del maestro, pero no en las
de los esclavos. (Para arreglar esto, OPTIMIZE TABLE,
ANALYZE TABLE, y REPAIR
TABLE se escriben en el registro binario a partir de MySQL 4.1.1).
La tabla está almacenada utilizando un motor de almacenamiento diferente en el maestro
que en el esclavo. (Es posible utilizar diferentes motores de almacenamiento en el maestro y el
esclavo. Por ejemplo, puede utilizar InnoDB en el maestro, pero
MyISAM en el esclavo, si el esclavo tiene menos espacio de disco disponible.)
El tamaño de buffer de MySQL (key_buffer_size, y demás) es diferente
en el maestro y el esclavo.
El maestro y el esclavo ejecutan versiones de MySQL diferentes, y el código del optimizador difiere entra esas dos versiones.
Este problema podría también afectar a la restauración de bases de datos utilizando mysqlbinlog|mysql.
La manera más fácil de evitar este problema es añadir una clausula
ORDER BY a las mencionadas consultas no-deterministas para asegurarse
de que los registros son siempre almacenados o modificados en el mismo orden.
En versiones futuras de MySQL, añadiremos automáticamente una clausula
ORDER BY allá donde sea necesaria.
Los siguientes problemas son conocidos y serán arreglados a su debido tiempo:
Los nombres de archivo de los registros se basan en el nombre del servidor (si no especifica
un nombre en la opción de inicio). Tiene que utilizar opciones como
--log-bin= si usted cambia
el nombre de su servidor. Otra opción es renombrar los antiguos archivos para reflejar el cambio
al nuevo nombre (si estos son registros binarios, debería editar el archivo de índice del registro
binario y arreglar los nombres también). Consulte Sección 5.3.1, “Opciones del comando mysqld”.
old_host_name-bin
mysqlbinlog no borra los archivos temporales tras un comando
LOAD DATA INFILE. Consulte Sección 8.5, “La utilidad mysqlbinlog para registros binarios”.
RENAME no funciona con tablas
TEMPORARY o tablas utilizadas en una tabla MERGE.
Debido a la manera en que los archivos de definición de talba son almacenados, usted no puede
utilizar el carácter 255 (CHAR(255)) en los nombres de tabla, columna, o
enumeraciones. Esto será arreglado previsiblemente en la versión 5.1, cuando implementemos
un nuevo formato de archivo de definición de tablas.
Cuando utiliza SET CHARACTER SET, usted no puede utilizar caracteres traducidos
en los nombres de base de datos, tabla y columna.
No puede utilizar '_' o '%' con ESCAPE en
LIKE ... ESCAPE.
Si usted tiene una columna DECIMAL en la que el mismo número se almacena
en diferentes formatos (por ejemplo, +01.00, 1.00,
01.00), GROUP BY puede tratar cada valor como uno diferente.
No puede instalar el servidor en otro directorio cuando utiliza MIT-pthreads. Debido a que este problema requiere cambios en los hilos MIT-pthreads, no es probable que lo arreglemos. Consulte Sección 2.8.5, “Notas sobre MIT-pthreads”.
Los valores BLOB y TEXT no puede ser utilizados
“de manera fiablemente” en GROUP
BY, ORDER BY o
DISTINCT. Solo los primeros max_sort_length se utilizan para
comparar valores BLOB en estos casos. El valor por defecto de
max_sort_length es 1024 y puede cambiarse en el momento de iniciar el servidor.
A partir de MySQL 4.0.3, también puede cambiarse en tiempo de ejecución. En versiones más antiguas,
una solución alternativa es utilizar una subcadena de caracteres. Por ejemplo:
SELECT DISTINCT LEFT(blob_col,2048) FROMnombre_de_tabla;
Los cálculos numéricos son hechos con BIGINT
o DOUBLE (ambos son normalmente de 64 bits de longitud). La precisión que
usted obtenga depende de la función. La regla general es que las funciones de bit son realizadas
con precisión de BIGINT, IF
y ELT() con precisión BIGINT
o DOUBLE, y el resto con precisión DOUBLE.
Debería evitar utilizar valores sin signo largos si son más grandes de 63 bits
(9223372036854775807) para cualquier cosa que no sean campos de tipo bit. La versión 4.0
de MySQL tiene mejor gestión de BIGINT que 3.23.
Puede tener hasta 255 columnas ENUM y
SET en una tabla.
En las funciones MIN(), MAX(), y otras funciones de
agregación, MySQL actualmente compara las columnas ENUM y
SET por su valor de cadena decaracteres en vez de la posición relativa
de la cadena en el conjunto.
mysqld_safe redirige todos los mensajes desde
mysqld al registro mysqld. Un problema
con esto es que si usted ejecuta mysqladmin refresh para cerrar
y reabrir el registro, stdout y stderr
son redirigidos todavía al registro antiguo. Si usted utiliza
--log a menudo, debería editar mysqld_safe para
que almacene sus registros en
en vez de
host_name.err de manera que pueda fácilmente
recuperar el espacio borrando el registro antiguo y ejecutando mysqladmin
refresh.
host_name.log
En una sentencia UPDATE, las columnas son actualizadas de izquierda
a drecha. Si se refiere a una columna actualizada, usted obtiene el valor actualizado en vez
del original. Por ejemplo, la siguiente sentencia incrementa KEY en
2, no 1:
mysql> UPDATE nombre_de_tabla SET KEY=KEY+1,KEY=KEY+1;
Puede referirse a múltiples tablas temporales en la misma sentencia, pero no puede referirse a ninguna de ellas más de una vez. Por ejemplo, lo siguiente no funciona:
mysql> SELECT * FROM temp_table, temp_table AS t2; ERROR 1137: Can't reopen table: 'temp_table'
El optimizador podría gestionar DISTINCT de manera diferente
cuando esté utilizando columnas ocultas en una join, y cuando no lo haga. En una join, las columnas
ocultas se contan como parte del resultado (aunque no sean mostradas), mientras que en las consultas
normales, las columnas ocultas no participan en la comparación
DISTINCT. Probalemente cambiemos esto en el futuro para que nunca se comparen
las columnas ocultas al ejecutar DISTINCT.
Un ejemplo de esto es:
SELECT DISTINCT mp3id FROM band_downloads
WHERE userid = 9 ORDER BY id DESC;
and
SELECT DISTINCT band_downloads.mp3id
FROM band_downloads,band_mp3
WHERE band_downloads.userid = 9
AND band_mp3.id = band_downloads.mp3id
ORDER BY band_downloads.id DESC;
En el segundo caso, al utilizar el servidor MySQL 3.23.x, podría obtener dos registros idénticos
en el conjunto de resultados (porque los valores en las columnas id ocultas
podrían diferir).
Tenga en cuenta que esto pasa solo en las consultas que no tienen
columnas pertenecientes al ORDER BY en el resultado.
Si ejecuta un PROCEDURE en una consulta que retorna un conjunto vacío, en
algunos casos el PROCEDURE no transforma las columnas.
La creación de una tabla de tipo MERGE no comprueba si los tablas
subyacentes son de tipos compatibles.
Si utiliza ALTER TABLE para añadir un índice
UNIQUE a una tabla utilizada en una tabla
MERGE y después añade un índice normal en la tabla
MERGE, el orden de las claves es diferente para las tablas si había una clave
no-UNIQUE antigua en la tabla. Esto es porque
ALTER TABLE pone índices UNIQUE antes
de los índices normales para poder detectar claves duplicadas tan pronto como sea posible.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

