jueves, 20 de agosto de 2009

Variable MySQL para case sensitive de tablas

http://dev.mysql.com/doc/refman/5.0/es/name-case-sensitivity.html

¿Como modificar el valor de la variable lower_case_table_names?


Los siguientes pasos se deben realizar con permisos suficientes, en mi caso fue directamente con root.

  1. Como la variable lower_case_table_names no es dinámica, no puede modificarse mientras MySQL esta funcionando por que debemos parar el servicio mysqld
    • $root>/sbin/service mysqld stop
  2. Después vamos al archivo my.cnf que en Mandriva 2008.1 está en /etc
    • $root>vi /etc/my.cnf
  3. En este archivo vamos a la sección [mysqld] y agregamos
    • lower_case_table_names = 1
  4. Guardamos el archivo y reiniciamos MySQL:
    • :wq
    • /sbin/service mysqld start
Con los pasos anteriores bastó para mí, si tienen alguna duda, espero poder ayudarlos.

Explicaciòn:

El modo en que se almacenan los nombres de tablas y bases de datos en disco y son usados en MySQL depende de la definición de la variable de sistema lower_case_table_names, la cual se puede asignar cuando se arranca mysqld. lower_case_table_names puede tomar uno de los valores siguientes:

Valor Significado
0 Los nombres de tablas y bases de datos se almacenan en disco usando los tipos de caracteres usados en en las sentencias CREATE TABLE o CREATE DATABASE. Las comparaciones de nombres son sensibles al tipo. Este es el valor en sistemas Unix. Si se fuerza este valor 0 con --lower-case-table-names=0 en un sistema de ficheros no sensible al tipo y se accede a nombres de tablas MyISAM usando diferentes tipos de caracteres, se puede producir corrupción de índices.
1 Los bombres de las tablas se almacenan en disco usando minúsculas y las comparaciones de nombres no son sensibles al tipo. MySQL convierte todos los nombres de tablas a minúsculas al almacenarlos y leerlos. Este comportamiento también se aplica a nombres de bases de datos desde MySQL 4.0.2, y a alias de tablas a partir de 4.1.1. Este es el valor por defecto en sistemas Windows y Mac OS X.
2 Los nombres de tablas y bases de datos se almacenan en disco usando el tipo de letra especificado en las sentencias CREATE TABLE o CREATE DATABASE, pero MySQL los convierte a minúscula al leerlos. Las comparaciones de nombres no son sensibles al tipo. Nota: esto funciona sólo en sistemas de ficheros que no sean sensibles al tipo. Los nombres de tablas InnoDB se almacenan en minúscylas, igual que si lower_case_table_names=1. Asignar lower_case_table_names a 2 se puede hacer desde MySQL 4.0.18.

Si sólo se está usando MySQL para una plataforma, generalmente no será necerasio modificar la variable lower_case_table_names variable. Sin embargo, se pueden presentar dificultades si se quieren transferir tablas entre plataformas que tengan sistemas de ficheros con distintas sensibilidades al tipo. Por ejemplo, en Unix, se pueden tener dos tablas diferentes llamadas my_table y MY_TABLE, pero en Windows estos nombres se consideran el mismo. Para impedir problemas de transferencia de datos debidos al tipo de letras usados en nombres de bases de datos o tablas, hay dos opciones:

  • Usar lower_case_table_names=1 en todos los sistemas. La desventaja principal con esta opción es que cuando se usa SHOW TABLES o SHOW DATABASES, no se ven los nombres en el tipo de letras original.
  • Usar lower_case_table_names=0 en Unix y lower_case_table_names=2 en Windows. Esto preserva el tipo de letras en nombres de bases de datos y tablas. La desventaja es que se dene asegurar que las consultas siempre se refieren a los nombres de bases de datos y tablas usando los tipos de caracteres correctos en Windows. Si se transfieren las consultas a Unix, donde el tipo de los caracteres es importante, no funcionarán si el tipo de letra es incorrecto.

Nota: antes de asignar 1 a lower_case_table_names en Unix, se deben convertir los viejos nombres de bases de datos y tablas a minúscula antes de reiniciar mysqld.


En Windows, se supone que hay un fichero llamado my.ini en el directorio c:\Windows, c:\WinNT o como se llame. Este es el fichero de configuración principal, aunque tambien puedes usar un my.cnf situado en c:\. MySQL primero busca el php.ini y luego el my.cnf, si encuentra los dos, los valores que hallas puesto en my.cnf sobreescriben los del php.ini. Curiosamente ahora no se en que casos resulta práctico usar los dos... De todas formas, lo mejor es usar solo uno de ellos.

En linux y similares, normalmente el fichero de configuración principal esta en /etc/my.cnf. Y si no me equivoco... también busca un posible my.cnf en el directorio de datos de MySQL. Y también busca ~/.my.cnf, el cual define opciones especificas del usuario, lo cual no esta nada mal. Como en Windows, los valores de los distintos ficheros de configuración sobreescriben los valores definidos anteriormente.

Creo que en la documentación de MySQl dice algo sobre el tema.... Si, algo dice:

http://www.mysql.com/doc/en/Name_case_sensitivity.html

Al parecer si inicias mysql con la opción -O lower_case_table_names=1 te convierte todas las mayusculas a minusculas. Es decir, si añades lo siguiente en tu my.cnf deberia funcionar:

[mysqld]
set-variable = lower_case_table_names=1

Aunque al parecer esto es solo para Linux y similares, en Windows y según la documentación esto es así por defecto. Aunque por probarlo no pasa nada...

3 comentarios: