Mysql截断GROUP_CONCAT函数的连接结果

pou*_*uya 42 mysql types truncate view

我创建了一个视图,该视图使用GROUP_CONCAT来连接来自产品列的查询的结果,其中数据类型'varchar(7) utf8_general_ci'位于名为的列中concat_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
Run Code Online (Sandbox Code Playgroud)

concat_products_vw查看:

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` 
Run Code Online (Sandbox Code Playgroud)

根据mysql手册

VARCHAR列中的值是可变长度字符串
长度可以指定为MySQL 4.0.2之前的1到255之间的值,以及MySQL 4.0.2之后的0到255之间的值.

编辑:

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

  1. 为什么mysql为varchar concat_products列指定了超过255个字符?(已解决!)

  2. 为什么uf8_bin而不是utf8_general_ci?

  3. 是否可以将视图中列的数据类型更改为例如在我的情况下为concat_products列的文本?

  4. 如果不是我能做些什么来阻止mysql截断concat_products列?

Joc*_*lyn 74

正如我在之前的评论中所写,MySQL手册说:

VARCHAR列中的值是可变长度字符串.长度可以指定为0到65,535之间的值.

所以问题不在于字段的数据类型.

MySQL手册也说:

结果被截断为group_concat_max_len系统变量给出的最大长度,该变量的默认值为1024.尽管返回值的有效最大长度受max_allowed_pa​​cket的值约束,但该值可以设置得更高.在运行时更改group_concat_max_len的值的语法如下,其中val是无符号整数:SET [GLOBAL | SESSION] group_concat_max_len = val;

您更改group_concat_max_len值的选项有:

  1. 通过将此附加到命令来更改MySQL启动时的值:
    --group_concat_max_len=your_value_here
  2. 在MySQL配置文件(mysql.ini)中添加此行: group_concat_max_len=your_value_here
  3. MySQL启动后运行此命令:
    SET GLOBAL group_concat_max_len=your_value_here;
  4. 打开MySQL连接后运行此命令:
    SET SESSION group_concat_max_len=your_value_here;

文档:SET,服务器系统变量:group_concat_max_len

  • 我个人使用我列出的第四个选项,因为我的脚本中只有少数需要计算"大"GROUP_CONCAT,而且这些脚本不经常运行. (3认同)

Jos*_*shS 8

正如乔斯林所提到的那样,GROUP_CONCAT()结果的大小受到限制group_concat_max_len,但是有一个额外的相互作用ORDER BY导致进一步截断到1/3 group_concat_max_len.例如,请参阅此相关答案.

默认值为group_concat_max_len1024,而1024/3 = 341可能解释了为什么concat_products的类型显示为varchar(341)原始示例中的原因.如果要删除该GROUP BY productId子句,concat_products应显示为varchar(1024).

我还没有发现之间的这种互动GROUP_CONCAT()ORDER BY中提到的MySQL手册,但它至少影响到MySQL服务器5.1.