From 54499f0678e8df5581d44a22ffbd484800b66d76 Mon Sep 17 00:00:00 2001 From: Citrons <909229731@qq.com> Date: Mon, 17 Aug 2026 17:28:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(GOV-011):=20=E6=94=BE=E5=AE=BD=20MySQL=20?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E4=B8=BA=E5=AE=8C=E6=95=B4=205.7=20?= =?UTF-8?q?=E7=B3=BB=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/database/schema-baseline.mjs | 8 +++---- tools/database/schema-baseline.test.mjs | 31 ++++++++++++++++--------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/tools/database/schema-baseline.mjs b/tools/database/schema-baseline.mjs index ec79f30..fc64742 100644 --- a/tools/database/schema-baseline.mjs +++ b/tools/database/schema-baseline.mjs @@ -73,8 +73,8 @@ export function assertSafeDevelopmentConfiguration(config) { } /** - * 客户端保持 5.7 系列以生成兼容导出;服务端固定 5.7.42,避免开发、测试和生产 - * 由不同补丁行为产生漂移。同时核对数据库真实字符规则,而不是信任 env 声明。 + * mysql、mysqldump 与服务端统一接受完整 5.7.x;字符集和排序规则仍按精确值 + * 校验,避免放宽补丁版本时意外放宽数据库结构兼容边界。 */ export function assertMysql57Metadata(metadata) { if (!/^5\.7\.\d+(?:[-+].*)?$/.test(metadata.mysqlClientVersion ?? '')) { @@ -85,8 +85,8 @@ export function assertMysql57Metadata(metadata) { `mysqldump 客户端必须为 5.7.x,实际 ${metadata.mysqldumpClientVersion || '(空)'}`, ); } - if (!/^5\.7\.42(?:[-+].*)?$/.test(metadata.serverVersion ?? '')) { - throw new Error(`MySQL 服务端必须为 5.7.42,实际 ${metadata.serverVersion || '(空)'}`); + if (!/^5\.7\.\d+(?:[-+].*)?$/.test(metadata.serverVersion ?? '')) { + throw new Error(`MySQL 服务端必须为 5.7.x,实际 ${metadata.serverVersion || '(空)'}`); } requireExactValue(metadata.databaseCharset, REQUIRED_CHARSET, '开发数据库字符集不符合要求'); requireExactValue( diff --git a/tools/database/schema-baseline.test.mjs b/tools/database/schema-baseline.test.mjs index 90febec..3ae913d 100644 --- a/tools/database/schema-baseline.test.mjs +++ b/tools/database/schema-baseline.test.mjs @@ -132,19 +132,28 @@ test('拒绝错误字符集、排序规则和不完整的启用配置', () => { ); }); -test('只接受 MySQL 5.7 客户端、5.7.42 服务端和固定数据库字符规则', () => { - assert.doesNotThrow(() => assertMysql57Metadata(validMetadata)); +test('接受完整 MySQL 5.7.x 服务端系列', () => { + for (const serverVersion of ['5.7.0', '5.7.41', '5.7.42-log']) { + assert.doesNotThrow(() => + assertMysql57Metadata({ ...validMetadata, serverVersion }), + ); + } +}); + +test('拒绝非 MySQL 5.7.x 版本并保持固定数据库字符规则', () => { + for (const serverVersion of ['5.6.51', '8.0.40', '5.7', '5.7.x', '']) { + assert.throws( + () => assertMysql57Metadata({ ...validMetadata, serverVersion }), + /MySQL 服务端必须为 5\.7\.x/, + ); + } assert.throws( - () => assertMysql57Metadata({ ...validMetadata, serverVersion: '8.0.39' }), - /服务端必须为 5\.7\.42/, + () => assertMysql57Metadata({ ...validMetadata, mysqlClientVersion: '8.0.40' }), + /mysql 客户端必须为 5\.7\.x/, ); assert.throws( - () => assertMysql57Metadata({ ...validMetadata, serverVersion: '5.7.41' }), - /服务端必须为 5\.7\.42/, - ); - assert.throws( - () => assertMysql57Metadata({ ...validMetadata, mysqlClientVersion: '8.0.39' }), - /mysql 客户端必须为 5\.7/, + () => assertMysql57Metadata({ ...validMetadata, mysqldumpClientVersion: '8.0.40' }), + /mysqldump 客户端必须为 5\.7\.x/, ); assert.throws( () => assertMysql57Metadata({ ...validMetadata, databaseCollation: 'utf8mb4_bin' }), @@ -501,7 +510,7 @@ test('校验拒绝篡改成错误 MySQL 版本或伪造对象范围的真实清 const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')); manifest.mysql_server_version = '8.0.39'; writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`); - assert.throws(() => verifyBaselineDirectory(target, 'v0.0.5'), /服务端必须为 5\.7\.42/); + assert.throws(() => verifyBaselineDirectory(target, 'v0.0.5'), /服务端必须为 5\.7\.x/); manifest.mysql_server_version = '5.7.42-log'; manifest.objects.events = false;