postgres group_concat español ejemplos mysql view types truncate

español - Mysql trunca el resultado concatenado de una función GROUP_CONCAT



group_concat sql server (2)

Creé una vista que usa GROUP_CONCAT para concatenar los resultados de una consulta en la columna de productos con el tipo de datos ''varchar(7) utf8_general_ci'' en una columna llamada concat_products . El problema es que mysql trunca el valor de la columna concat_products. phpMyAdmin dice que el tipo de datos de la columna concat_products es varchar(341) utf8_bin

productos de mesa:

CREATE TABLE `products`( `productId` tinyint(2) unsigned NOT NULL AUTO_INCREMENT, `product` varchar(7) COLLATE utf8_general_ci NOT NULL, `price` mediumint(5) unsigned NOT NULL, PRIMARY KEY (`productId`)) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

concat_products_vw Vista:

CREATE VIEW concat_products_vw AS SELECT `userId`, GROUP_CONCAT(CONCAT_WS(''_'', `product`, `productId`, `price`) ORDER BY `productId` ASC SEPARATOR ''*'') AS concat_products FROM `users` LEFT JOIN `products` ON `users`.`accountBalance` >= `product`.`price` GROUP BY `productId`

según el manual de mysql

Los valores en las columnas VARCHAR son cadenas de longitud variable
La longitud se puede especificar como un valor de 1 a 255 antes de MySQL 4.0.2 y de 0 a 255 a partir de MySQL 4.0.2.

editar:

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535.

  1. ¿Por qué mysql especifica más de 255 caracteres para la columna varchar concat_products? (¡Resuelto!)

  2. ¿Por qué uf8_bin en lugar de utf8_general_ci?

  3. ¿Es posible cambiar el tipo de datos de una columna en una vista, por ejemplo, en mi caso, al texto de la columna concat_products?

  4. Si no, ¿qué puedo hacer para evitar que mysql trunque la columna concat_products?


Como mencionó Jocelyn, el tamaño de un resultado GROUP_CONCAT() está limitado por group_concat_max_len , sin embargo hay una interacción adicional con ORDER BY que da como resultado un truncamiento adicional a 1/3 de group_concat_max_len . Para un ejemplo, vea esta respuesta relacionada .

El valor predeterminado para group_concat_max_len es 1024, y group_concat_max_len = 341 probablemente explica por qué el tipo de concat_products aparece como varchar(341) en el ejemplo original. Si eliminara la cláusula GROUP BY productId , concat_products debería aparecer como varchar(1024) .

No he encontrado esta interacción entre GROUP_CONCAT() y ORDER BY mencionada en el Manual de MySQL , pero afecta al menos a MySQL Server 5.1.


Como ya escribí en un comentario anterior, el manual de MySQL dice:

Los valores en las columnas VARCHAR son cadenas de longitud variable. La longitud se puede especificar como un valor de 0 a 65,535.

Entonces, el problema no está en el tipo de datos del campo.

El manual de MySQL también dice:

El resultado se trunca a la longitud máxima que da la variable de sistema group_concat_max_len, que tiene un valor predeterminado de 1024. El valor puede establecerse más alto, aunque la longitud máxima efectiva del valor de retorno está restringida por el valor de max_allowed_packet. La sintaxis para cambiar el valor de group_concat_max_len en tiempo de ejecución es la siguiente, donde val es un entero sin signo: SET [GLOBAL | SESIÓN] group_concat_max_len = val;

Sus opciones para cambiar el valor de group_concat_max_len son:

  1. cambiando el valor en el inicio de MySQL adjuntando esto al comando:
    --group_concat_max_len=your_value_here
  2. agregando esta línea en su archivo de configuración de MySQL (mysql.ini): group_concat_max_len=your_value_here
  3. ejecutando este comando después del inicio de MySQL:
    SET GLOBAL group_concat_max_len=your_value_here;
  4. ejecutando este comando después de abrir una conexión MySQL:
    SET SESSION group_concat_max_len=your_value_here;

Documentación: SET , variables del sistema del servidor: group_concat_max_len