Mysql的截断一个GROUP_CONCAT功能的连接后的结果(Mysql truncates co

2019-06-27 03:23发布

我已经创建其使用GROUP_CONCAT来自以数据类型上的产品列的查询串联结果的图'varchar(7) utf8_general_ci'在名为柱concat_products 。 问题是,MySQL的截断concat_products列的值。 说成功运行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查看:

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` 

根据MySQL手册

在VARCHAR列中的值是可变长度字符串
长度可以被指定为从1到255的MySQL 4.0.2之前0至255的数值,例如MySQL 4.0.2的。

编辑:

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列?

Answer 1:

正如我已经在前面的评论中写道,在MySQL手册说:

在VARCHAR列中的值是可变长度的字符串。 长度可以被指定为从0到65535的值。

所以,问题不在于该字段的数据类型。

在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



Answer 2:

如乔斯林提到的,大小GROUP_CONCAT()结果为界group_concat_max_len ,但是存在具有附加的相互作用ORDER BY ,在一个进一步的截短会导致到1/3 group_concat_max_len 。 举一个例子,看到这个相关的答案 。

作为默认值group_concat_max_len为1024,1024/3 = 341可能解释了为什么concat_products的类型显示为varchar(341)在最初的例子。 如果要删除GROUP BY productId条款,concat_products应该显示为varchar(1024)

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



文章来源: Mysql truncates concatenated result of a GROUP_CONCAT Function