一尘不染

Mysql截断GROUP_CONCAT函数的连接结果

mysql

我创建它使用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

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. 为什么mysql为varchar concat_products列指定超过255个字符?(已解决!)

  2. 为什么用uf8_bin而不是utf8_general_ci?

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

  4. 如果不是,我该如何防止mysql截断concat_products列?


阅读 280

收藏
2020-05-17

共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

2020-05-17