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之间的值。

  • 为什么MySQL为
    varchar
    “concat\u products”列指定超过255个字符?(解决了!)

  • 为什么
    uf8\u bin
    而不是
    utf8\u general\u ci

  • 是否可以将视图中某列的数据类型(例如在我的案例中)更改为“concat_products”列的文本

  • 如果没有,我可以做什么来防止MySQL截断“concat_products”列


  • 正如我在早些时候的评论中所写的那样,报告说:

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

    因此,问题不在于字段的数据类型

    报告还说:

    结果将被截断为 group_concat_max_len系统变量,默认值为 1024该值可以设置得更高,尽管返回值的有效最大长度受 允许的最大数据包数。用于更改的值的语法 运行时的组concat_max_len如下所示,其中val是 无符号整数: 设置[全局|会话]组_concat_max_len=val

    更改组\u concat\u max\u len值的选项有:

  • 在MySQL启动时更改值,方法是将其附加到命令:
    --组\u concat\u max\u len=此处的值
  • 在MySQL配置文件(MySQL.ini)中添加此行:
    group\u concat\u max\u len=your\u value\u此处
  • MySQL启动后运行此命令:
    在此处设置全局组\u concat\u max\u len=您的\u值\u
  • 打开MySQL连接后运行此命令:
    在此处设置会话组\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`