mysql中每个group_concated项都有字符限制吗?

时间:2017-09-25 05:57:57

标签: mysql group-concat

我正在使用group_concat将文本与其他文本信息附加到某些项目。有5个属于某个项目的文本,这些文本可能非常大(最多3000个字符)。

在我增加group_concat_max_len之前,它确实在某个时刻剪切了group_concated文本(例如,文本1和2是group_concated但文本3,4和5不是因为group_concat_max_len限制太低)。

在我将group_concat_max_len增加到10MB(这对我的任务来说已经足够了)之后,它会对所有五个文本进行group_concat,但如果单个文本太大(大约> 1500个字符),它将剪切单个group_concated文本(不是整个小组)。 这意味着group_concat_max_len为10MB,我现在可以group_concat甚至50个文本,每个文本都有1000个字符,但是如果其中一个文本有大约。超过1500个字符,这个字符的字符将被切断。

因此,我的问题是,单个group_concated文本的大小是否有限制以及如何修复它?

------------------ EDIT ---------------------------- -

感谢草莓和solarfare的提示 - 所以group_concat不是问题。我知道在整个查询的一小部分测试它,同时在查询后立即转储结果。此外,我检查了表格,整个文本肯定存储在表格字段中。一旦获取了行,仍然存在文本被截止的问题。我假设知道这是表设置的东西,但我无法弄明白。请参阅我的查询和相应的表格设置。

public function test(){
    $sql = "SELECT vi.*, "
    . "GROUP_CONCAT(DISTINCT vis.info_en ORDER BY vis.priority 
       SEPARATOR '----') as settings FROM $this->table AS vi "
    . "LEFT JOIN vocab_items_settings vis ON vis.vocab_item_id = vi.id "
    . "WHERE vi.id = 281";

    $stmt = $this->db->prepare($sql);
    $stmt->execute();
    $row = $stmt->fetch();

    echo '<pre>';
    print_r($row);
    exit;
    //text of the first group_concated item is the largest and gets cut-off after approx 1500 chars. I replaced it with other dummy-text but issue is still there. All further group_concated texts to the item do not exceed approx 1500 chars and thus do not get cut-off 
}

enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

由于用户randomsock遇到了同样的问题,因此我要发布最终执行的结果。我从没有深入了解此问题,因此最终删除了包含大文本部分的GROUP_CONCAT部分,取而代之的是,在获取查询后,我用PHP进行了数组结构化。总的来说,除非处理少量数据,否则我再也不会使用GROUP_CONCAT

  1. 我没有GROUP_CONCAT来添加数据,而是将它们添加到了SELECT部分。现在,这导致获取了多行,而不是1行,其中所有行都在group_concated里面。

vi = vocab_items

vis = vocab_item_settings(包括较大的文本部分)

$sql = "SELECT vi.*, vis.info_en, vis.name FROM $this->table AS vi "
. "LEFT JOIN vocab_items_settings vis ON vis.vocab_item_id = vi.id "
. "WHERE vi.id = 281";

$stmt = $this->db->prepare($sql);
$stmt->execute();
$row = $stmt->fetchAll();
  1. 在PHP中进行结构化

a。我使用vocab_items(vi)中的数据创建了一个数组,每个数据行都相同。因此,我使用了rows[0]

$formatted_rows = array(
        'title' => $rows[0]['title'],
        'type' => $rows[0]['type'],
        .....
);

b。我将每个vocab_item_settings(可见)推入$formatted_rows数组中。就我而言,每个vocab_item_settings实际上都有多个文本。因此,在这种情况下,我还必须防止重复项被添加到$formatted_rows['settings'][]数组中,正如我注释掉的三行代码(//)

所示。
// $valArr = array();
foreach ($rows as $row) {
    //if (!in_array($row['name'], $valArr)) {
        $formatted_rows['settings'][] = array(
                'info' => $row['info_en'],
                .....
        )
        //array_push($valArr, $row['name']);
    }


}