mirror of
https://gitee.com/mateos/mateclaw.git
synced 2026-09-14 19:45:08 +08:00
fix(persistence): prevent assistant message loss from column truncation and JDBC charset
This commit is contained in:
parent
0665a6be09
commit
da6fa5089d
@ -5,7 +5,12 @@ spring:
|
|||||||
# 自动创建的库用了 server 默认字符集也不会影响数据。要求 DB user 具备 CREATE 权限(默认 root 可)。
|
# 自动创建的库用了 server 默认字符集也不会影响数据。要求 DB user 具备 CREATE 权限(默认 root 可)。
|
||||||
# 如果使用受限账号,请提前手工执行:
|
# 如果使用受限账号,请提前手工执行:
|
||||||
# CREATE DATABASE mateclaw CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
# CREATE DATABASE mateclaw CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:mateclaw}?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
# characterEncoding=utf8mb4 + connectionCollation=utf8mb4_unicode_ci force
|
||||||
|
# the JDBC connection to negotiate 4-byte UTF-8 end-to-end. With 3-byte
|
||||||
|
# `utf8` the driver rejects emoji and CJK supplementary-plane chars even
|
||||||
|
# when the table charset is utf8mb4, surfacing as
|
||||||
|
# `Data truncation: Incorrect string value` on assistant message INSERT.
|
||||||
|
url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:mateclaw}?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
username: ${DB_USERNAME:root}
|
username: ${DB_USERNAME:root}
|
||||||
password: ${DB_PASSWORD:mateclaw123}
|
password: ${DB_PASSWORD:mateclaw123}
|
||||||
|
|||||||
@ -0,0 +1,7 @@
|
|||||||
|
-- V91: Mirror MySQL widening of mate_message.content / content_parts and
|
||||||
|
-- mate_skill.skill_content. H2's TEXT is already CLOB (effectively unbounded)
|
||||||
|
-- so the change is a no-op semantically; it keeps both dialects in sync.
|
||||||
|
|
||||||
|
ALTER TABLE mate_message ALTER COLUMN content CLOB;
|
||||||
|
ALTER TABLE mate_message ALTER COLUMN content_parts CLOB;
|
||||||
|
ALTER TABLE mate_skill ALTER COLUMN skill_content CLOB;
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
-- V91: Widen mate_message.content / content_parts and mate_skill.skill_content
|
||||||
|
-- from TEXT (64KB) to MEDIUMTEXT (16MB).
|
||||||
|
--
|
||||||
|
-- TEXT caps at 65,535 bytes. A multi-turn ReAct session accumulates tool calls
|
||||||
|
-- and observations into content_parts JSON well past that cap, and a long
|
||||||
|
-- Chinese final answer (~22k chars × 3 bytes UTF-8) overflows `content`.
|
||||||
|
-- The truncation rejects the assistant message INSERT after the SSE stream
|
||||||
|
-- has already finished, so users see the reply live but it disappears on
|
||||||
|
-- page reload (only the user message survives in the DB).
|
||||||
|
--
|
||||||
|
-- Idempotent: only modifies the column when its current type is still TEXT.
|
||||||
|
|
||||||
|
SET @c := (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA = DATABASE()
|
||||||
|
AND TABLE_NAME = 'mate_message'
|
||||||
|
AND COLUMN_NAME = 'content');
|
||||||
|
SET @s := IF(@c = 'text',
|
||||||
|
'ALTER TABLE mate_message MODIFY COLUMN content MEDIUMTEXT',
|
||||||
|
'SELECT 1');
|
||||||
|
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @c := (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA = DATABASE()
|
||||||
|
AND TABLE_NAME = 'mate_message'
|
||||||
|
AND COLUMN_NAME = 'content_parts');
|
||||||
|
SET @s := IF(@c = 'text',
|
||||||
|
'ALTER TABLE mate_message MODIFY COLUMN content_parts MEDIUMTEXT',
|
||||||
|
'SELECT 1');
|
||||||
|
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @c := (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA = DATABASE()
|
||||||
|
AND TABLE_NAME = 'mate_skill'
|
||||||
|
AND COLUMN_NAME = 'skill_content');
|
||||||
|
SET @s := IF(@c = 'text',
|
||||||
|
'ALTER TABLE mate_skill MODIFY COLUMN skill_content MEDIUMTEXT',
|
||||||
|
'SELECT 1');
|
||||||
|
PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
Loading…
Reference in New Issue
Block a user