我正在使用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
}
答案 0 :(得分:0)
由于用户randomsock遇到了同样的问题,因此我要发布最终执行的结果。我从没有深入了解此问题,因此最终删除了包含大文本部分的GROUP_CONCAT
部分,取而代之的是,在获取查询后,我用PHP进行了数组结构化。总的来说,除非处理少量数据,否则我再也不会使用GROUP_CONCAT
。
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();
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']);
}
}