56

我创建了一个视图,该视图用于GROUP_CONCAT连接对 products 列的查询结果,该列的数据类型'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

“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 列中的值是可变长度字符串
长度可以指定为 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. varchar为什么 MySQL 为“concat_products”列指定超过 255 个字符?(解决了!)

  2. 为什么uf8_bin而不是utf8_general_ci

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

  4. 如果不是,我该怎么做才能防止 MySQL 截断“concat_products”列?

4

2 回答 2

87

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

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

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

MySQL手册还说 :

结果被截断为由 group_concat_max_len 系统变量给出的最大长度,其默认值为 1024。该值可以设置得更高,尽管返回值的有效最大长度受 max_allowed_pa​​cket 值的限制。在运行时更改 group_concat_max_len 值的语法如下,其中 val 是无符号整数: SET [GLOBAL | 会话] 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

于 2012-08-17T10:06:10.370 回答
12

正如 Jocelyn 所提到的,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).

我没有发现MySQL Manual中提到的这种交互GROUP_CONCAT(),但它至少会影响 MySQL Server 5.1。ORDER BY

于 2016-06-22T22:29:49.377 回答