jueves, 5 de junio de 2008

Como hacer a MySQL "NOT case sensitive"

Estaba probando unos queries SQL, previamente definidos en Windows por mi profesor, que están elaborados con mayúsculas y minúsculas sin importar el nombre de las tablas definidos en mi base de datos. Algo como esto:

SELECT CONCAT(Customers.CustLastName, ', ', Customers.CustFirstName) AS MailingName, Customers.CustStreetAddress, Customers.CustCity, Customers.CustState, Customers.CustZipCode FROM Customers UNION SELECT Vendors.VendName, Vendors.VendStreetAddress, Vendors.VendCity, Vendors.VendState, Vendors.VendZipCode FROM Vendors

Las letras marcadas en rojo representan una tabla en mi BD que esta definida en minúsculas.

Como ya llevo algunos meses intentando olvidar Windows lo estaba probando en Linux (Mandriva 2008.1) me di cuenta que no funcionaban y phpmyadmin siempre me regresaba un error de que la tabla no existía, algo como esto:

Después de estar leyendo un poco sobre las variables de MySQL concluí en varias cosas:

  1. No esta nada bien crear queries utilizando MayÚsCulas y minúsculas y mucho menos los nombre de las tablas, es ampliamente recomendable que estas se definan únicamente en minúsculas.
  2. Existen dos variables importantes en MySQL para permitir/restringir el uso de nombres con mayúsculas/minúsculas, estas son:
    • lower_case_file_system
    • lower_case_table_names
En mi caso la variable que tuve que modificar para poder realizar mis queries fue lower_case_table_names que permite lo siguientes valores:

0 - Los nombres de tablas y bases de datos se almacenan tal cual se hayan definido por el usuario en las sentencias CREATE DATABASE ó CREATE TABLE. Este valor es el predefinido para un sistema "case sensitive" como es Linux. Si este valor se asigna a un sistema "non-case sensitive" como Windows puedo producir serios errores en los índices.

1 - Valor predeterminado para sistemas Windows y MacOS. MySQL se encarga de convertir a minúsculas todos los nombres de tablas, tanto para almacenamiento como para búsqueda.

2 - Se almacenan tal cual se hayan definido por el usuario en las sentencias CREATE DATABASE ó CREATE TABLE. Al momento de realizar una búsqueda MySQL convierte todo a mínúsculas.

En mi caso la solución fue simplemente:
--lower_case_table_names = 1

¿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.

** No entiendo porque el procedmiento no es igual para lower_case_file_system pero al probarlo y modificar la variable a ON (ó 1) MySQL no reinicia por un problema de que no reconce la variable, si alguien sabe algo al respecto, por favor comenten!

2 comentarios:

Destructor, dijo...

Hola TDK bueno el tip, solo que se te fue un nombre por ahí pusiste lower_case_file_names y me parece que es lower_case_table_names; ya que todo el tiempo haces mención a esa variable.

Tdk dijo...

Listo Destructor, el error fue corregido. Gracias.