MySQL: Bases de datos y tablas «case insensitive»

 Como siempre, jugando, me he dedicado a migrar una base de datos de HSQLDB a MySQL.Me cogí la herramienta MySQL migration Toolkit que permite migrar de unas bases de datos a otras, leyendo de varias posibles bases de datos de origen (HSQLDB en mi caso) y creando los scripts necesarios para crear tablas e insertar datos en MySQL.

Me puse a hacer mis pruebas en Windows y sin graves problemas. Los scripts generados hay que tocarlos un poquito, pero sólo cuando hay alguna cosa rara. Por ejemplo, en el HSQLDB usaba un índice en una columna de TEXT de varios mil caracteres de largo. MySQL por lo visto no admite índices en columnas tan largas.

Una vez hecho todo y generados los scripts correctamente, me voy a la base de datos de MySQL de verdad (la de producción, en un sistema linux) y me dedico a ejecutar los scripts. Sin problemas … pero la aplicación (Liferay) que tiene que leer eso no se entera, es como si no existiera ninguna de las tablas y las crea todas de cero con los datos por defecto.

Investigando…. descubro que MySQL (al menos con MyISAM), crea un directorio por cada base de datos y tabla en el disco duro. Y por eso, según que el sistema operativo sea sensible o no a mayúsculas/minúsculas, MySQL es también sensible o no a mayúsculas minúsculas en los nombres de bases de datos y tablas. No afecta a columnas u otras cosas que no se guardan como nombre de fichero.

En windows, por defecto, es insensible y todas las tablas/bases de datos se guardan en minúsculas (independientemente de que el "create tabla UNA_TABLA lo ponga en mayúsculas). Al migrar a Linux, se crean todas esas bases de datos y tablas en minúsculas. Y Liferay usa nombres de tablas con la primera en mayúscula, por ejemplo, "Users". Así que no encuentra "Users", porque la que existe es "users" y la crea de nuevo. Ahora tengo dos tablas, "Users" y "users".

Afortunadamente, MySQL contempla el problema. Basta arrancar con mysqld –lower_case_table_names=1 y así cuando creemos cualquier base de datos o tabla, automáticamente la pondrá en minúsculas, haciendo que aparentemente se convierta en "case insensitive". No es totalmente cierto, porque lo que hace en realidad es convertirlo todo a minúsculas.

Pero, qué pasa con las bases de datos/tablas ya creadas. No queda más remedio que cambiarlas a minúsculas. Para ello, se hace un volcado de seguridad

mysqldump -u usuario -p –databases UNA_DATA_BASE > fichero_backup.sql

Luego borramos la base de datos de mysql (un DROP DATABASE UNA_DATA_BASE), paramos el mysqld, lo volvemos a ejecutar con la opción –lower_case_table_names=1 y restauramos el backup.

Listo, con esto conseguí hacerlo funcionar y migrar mi base de datos … tras casi toda una mañana de pruebas, google, pruebas y google.

Entradas relacionadas:

Esta entrada ha sido publicada en MySQL y etiquetada como , . Guarda el enlace permanente.

2 respuestas a MySQL: Bases de datos y tablas «case insensitive»

  1. Pingback: Diario de Programación » Blog Archive » Liferay: Migrando de HSQLDB a MySQL

  2. Pingback: Lo mejor de mi RSS del 5 al 11 de marzo | Linux Hispano

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.