MySQL截断GROUP_CONCAT函数的连接结果
我创建了一个视图,它使用MySQL截断GROUP_CONCAT函数的连接结果,mysql,view,types,truncate,Mysql,View,Types,Truncate,我创建了一个视图,它使用GROUP\u CONCAT在名为CONCAT\u products的列中连接数据类型为'varchar(7)utf8\u general\u ci'的products列上的查询结果 问题是MySQL截断了“concat_products”列的值。 phpMyAdmin说“concat_products”列的数据类型是varchar(341)utf8_bin 表产品: CREATE TABLE `products`( `productId` tinyint(2)
GROUP\u CONCAT
在名为CONCAT\u products
的列中连接数据类型为'varchar(7)utf8\u general\u ci'
的products列上的查询结果
问题是MySQL截断了“concat_products”列的值。
phpMyAdmin说“concat_products”列的数据类型是varchar(341)utf8_bin
表产品:
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”视图:
根据MySQL手册:
VARCHAR列中的值是可变长度字符串长度可以在MySQL 4.0.2之前指定为1到255的值,在MySQL 4.0.2之前指定为0到255的值
编辑 VARCHAR列中的值是可变长度字符串。长度可以指定为0到65535之间的值。
varchar
“concat\u products”列指定超过255个字符?(解决了!)
uf8\u bin
而不是utf8\u general\u ci
正如我在早些时候的评论中所写的那样,报告说: VARCHAR列中的值是可变长度字符串。长度可以 指定为0到65535之间的值 因此,问题不在于字段的数据类型 报告还说: 结果将被截断为 group_concat_max_len系统变量,默认值为 1024该值可以设置得更高,尽管返回值的有效最大长度受 允许的最大数据包数。用于更改的值的语法 运行时的组concat_max_len如下所示,其中val是 无符号整数: 设置[全局|会话]组_concat_max_len=val 更改组\u concat\u max\u len值的选项有:
--组\u concat\u max\u len=此处的值
group\u concat\u max\u len=your\u value\u此处
在此处设置全局组\u concat\u max\u len=您的\u值\u代码>
在此处设置会话组\u concat\u max\u len=您的\u值\u代码>
文档:,正如Jocelyn所提到的,一个
组CONCAT()
结果的大小受组CONCAT\u max\u len
的限制,但是还有一个与ORDER by
的额外交互作用,导致进一步截断为组CONCAT\u max\u len
的1/3。有关示例,请参见
group\u concat\u max\u len
的默认值为1024,1024/3=341可能解释了为什么在原始示例中concat\u产品的类型显示为varchar(341)
。如果要删除groupbyproductid
子句,concat\u产品应显示为varchar(1024)
我没有发现中提到的
GROUP_CONCAT()
和ORDER BY
之间的这种交互作用,但它至少会影响MySQL Server 5.1。您使用的MySQL版本是什么?请仔细检查您的源代码。表示:VARCHAR列中的值是可变长度的字符串。长度可以指定为0到65535之间的值。@Jocelyn你说得对,如果mysql可以在varchar列中存储多达65535个字符,为什么会在这里进行截断?感谢mysql不再截断concat_products列。我个人使用我列出的第四个选项,因为我的脚本中只有少数需要计算“大”字符GROUP_CONCAT,这些脚本不经常运行。
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`