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.
¿Por qué mysql especifica más de 255 caracteres para la columna varchar concat_products? (¡Resuelto!)
¿Por qué uf8_bin en lugar de utf8_general_ci?
¿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?
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:
- cambiando el valor en el inicio de MySQL adjuntando esto al comando:
--group_concat_max_len=your_value_here
- agregando esta línea en su archivo de configuración de MySQL (mysql.ini):
group_concat_max_len=your_value_here
- ejecutando este comando después del inicio de MySQL:
SET GLOBAL group_concat_max_len=your_value_here;
- 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