actiontech / sqle

一个支持多种不同类型数据库,覆盖事前控制、事后监督、标准发布场景,帮助您建立质量规范的SQL全生命周期质量管理平台
Mozilla Public License 2.0
1.42k stars 183 forks source link

规则:建议列与表使用同一个字符集,对建表语句的JSON列误触发 #2536

Open winfredLIN opened 1 month ago

winfredLIN commented 1 month ago

版本信息(Version)

3.24.04

问题描述(Describe)

在对建表语句审核时,若开启规则:建议列与表使用同一个字符集,且建表语句中包含JSON列时,会错误的触发该规则 image 根据文档: MySQL :: MySQL 8.4 Reference Manual :: 13.5 The JSON Data Type JSON在mysql的存储中的存储形式是二进制(binary) 但把json格式的字符集认为是binary,是不准确的 实际上查询mysql,json格式没有字符集 img_v3_02dm_a97e7020-a46d-440d-9ed8-cc435efdd4cg

截图或日志(Log)

如何复现(To Reproduce)

  1. 开启规则:建议列与表使用同一个字符集
  2. 用SQLE的一个表的建表语句进行测试
    CREATE TABLE `db_service_sync_tasks` (
    `uid` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
    `created_at` datetime(3) DEFAULT NULL,
    `updated_at` datetime(3) DEFAULT NULL,
    `name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
    `source` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `db_type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `cron_express` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    `last_sync_err` longtext COLLATE utf8mb4_unicode_ci,
    `last_sync_success_time` datetime(3) DEFAULT NULL,
    `extra_parameters` json DEFAULT NULL,
    PRIMARY KEY (`uid`),
    UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

    问题原因

    image 在曾经的一次变更中,错误的将json的列的字符集设置为binary

    解决方案

变更影响面

受影响的模块或功能

外部引用的潜在问题或风险

版本兼容性

测试建议