MySQL GROUP_CONCAT no devuelve toda la información

Nos encontramos con el caso que en una query de MySQL nos damos cuenta que el GROUP_CONCAT que estamos haciendo de un campo no nos está devolviendo todos los valores que esperaríamos.

Después de investigar un poco, nos damos cuenta que está cortando el texto de salida a 1024 carácteres.

Solución: GROUP_CONCAT_MAX_LEN

Existe una variable de MySQL que justamente limita a un número de carácteres determinado la salida de un GROUP_CONCAT. Se trata de la variable: group_concat_max_len.

Como saber qué valor tiene en nuestro entorno

Para saber el valor de la variable group_concat_max_len en nuestro propio caso, haremos lo siguiente:

Como modificar el valor de esta variable

Entonces, lo que debemos hacer es aumentar el valor de esa variable para que no nos limite la salida:

o si queremos cambiarlo solo para nuestra sesión actual:

Si ha funcionado correctamente, nuestra variable de sistema habrá cambiado su valor al nuevo que hemos especificado.

Tenemos que tener en cuenta que este valor va a perderse cuando el servidor se reinicie. Por lo tanto, si nos interesa persistir este valor de forma indefinida en el servidor, tendremos que editar el fichero de configuración de MySQL y hacer la modificación de la variable group_concat_max_len desde allí, de modo que ante cualquier reinicio, el valor especificado será cargado como valor por defecto.

#1227 – Access denied; you need the SUPER privilege for this operation

Al intentar modificar este valor, puede ser que nos aparezca este mensaje de error. Algo bastante habitual si lo estamos intentando hacer en un servidor compartido. Esto pasa porque nuestro usuario no tiene suficientes privilegios para hacer tal cambio en el servicio de MySQL.

Si tienes posibilidad de ejecutarlo con un usuario con permisos, vuelve a intentarlo de esta forma. Sino, tendrás que hablar con el administrador del sistema para que hagan ellos el cambio. Y sino, no te queda otra que buscar un método alternativo en tus queries.

from_unixtime() con timestamps negativos

La función FROM_UNIXTIME() de MySQL es la que nos permite convertir fechas almacenadas como TIMESTAMP a formato DATE.

Pero a la hora de usarla hay que tener en cuenta una limitación importante de esta, y es que esta función no acepta timestamps negativos, es decir, representaciones de fechas inferiores al año 1970. Por lo que si hacemos esto, nos devolverá NULL:

Una solución para los casos en que las fechas pueden ser timestamps negativos, es obtener la fecha no usando directamente la FROM_UNIXTIME(), si no con la función DATE_ADD(), sumando al timestamp 0, el intervalo de segundos que coincide con nuestro timestamp. De esa forma, tanto si el timestamp es positivo como si es negativo, obtendremos siempre la fecha correctamente:

 

Añadir texto a un campo de una tabla de MySQL

Queremos hacer una actualización masiva en una tabla de mysql, que consiste en añadir cierto texto al final del contenido ya existente. Para hacer esto, usaremos la función CONCAT() de MySQL.

El campo que queremos modificar es storageComments, y la tabla mostres. La sentencia de update sería:

Función from_unixtime con valores negativos

Usando la función from_unixtime() de MySQL, devuelve un valor NULL cuando todo parece estar correcto, y el campo pasado por parámetre existe.

Solución:

Parece ser que la función from_unixtime() de MySQL no acepta valores de unixtime negativos (anteriores al 01/01/1970). Y en el caso de que se le pase un valor negativo, devuelve NULL.

Una solución para estos casos consiste en hacer una suma de fechas, con la función date_add() de timestamp(0) más el valor de la fecha negativo, es decir:

Error en la importación de bases de datos

Tenemos una base de datos MySQL vacía, e intentamos importar mediante un script de exportación generado desde otro servidor MySQL, toda una base de datos, tanto estructura como datos. Subimos el script de importación desde desde PhpMyAdmin, y no se crea ni una tabla, dándonos el siguiente error:

Solución:

El error viene provocado por unas sentencias que hay en el inicio del fichero de importación, que se encargan de guardar los valores de determinadas variables globales del servidor de SQL, para reestablecer su valor una vez terminada la importación. En según que versiones de MySQL, estas variables todavía no existían (por ejemplo, la variable CHARACTER_SET_CLIENT solo está disponible a partir de la versión 5 de MySQL).

Para evitar este error, o bien actualizamos a una versión más reciente el sevidor MySQL (que ya iría siendo hora…) si tenemos tiempo y nos es posible, o sino borramos estas sentencias conflictivas. Si elegimos borrar las sentencias, hay que tener en cuenta que también tendremos que borrar las instrucciones del final del fichero, donde se reestablecen los valores que estas variables tenían antes de la importación.

Las sentencias del inicio del documento:

Las del final del documento:

Despues de haber hecho estas modificaciones en el fichero .SQL de la importación, probamos de hacer la importación de nuevo, y ahora ya no nos dará ningún error.

Formatos de fechas en MySQL

Pasar de String a Date:

Pasar de Date a String en un formato concreto:

En el segundo parámetro, que corresponde al formato en que se representará la fecha, pueden usarse todos los tokens listados en http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#func…

Conversión de Timestamp a Date:

donde dateReceived es un camp de la tabla m de tipo TIMESTAMP.

Conversión de Timestamp a String:

Intervalos

En este ejemplo hacemos una lista de la tabla X de los registros subidos en los últimos 7 días: