Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] 解析MySQL8.x的json类型字段时,_utf8mb4被统一成_utf8了 #6102

Open
lizongbo opened this issue Aug 19, 2024 · 0 comments
Open

Comments

@lizongbo
Copy link
Collaborator

Database Type

MySQL

Database Version

8.0.24

Druid Version

1.2.22

JDK Version

OpenJDK 8

Error SQL

CREATE TABLE `account_info` (
                    `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '主键id',
                    `account_num` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '账户编号',
                    `open_acct_agreement_info` json DEFAULT (_utf8mb4'{}') COMMENT '协议信息',
                    `ext_info` json DEFAULT (_utf8mb4'{}') COMMENT '扩展信息',
                    `last_push_time` datetime DEFAULT NULL COMMENT '账户推送时间',
                    `create_time` datetime NOT NULL COMMENT '创建时间',
                    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
                    PRIMARY KEY (`id`) USING BTREE,
                    UNIQUE KEY `idx_account_num` (`account_num`) USING BTREE
                    + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=COMPACT COMMENT='账户信息表';

Testcase Code

 @Test
    public void test_parse_create() {
        for (DbType dbType : new DbType[]{DbType.mysql}) {
            for (String sql : new String[]{
                "CREATE TABLE `account_info` (\n"
                    + "  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '主键id',\n"
                    + "  `account_num` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '账户编号',\n"
                    + "  `open_acct_agreement_info` json DEFAULT (_utf8mb4'{}') COMMENT '协议信息',\n"
                    + "  `ext_info` json DEFAULT (_utf8mb4'{}') COMMENT '扩展信息',\n"
                    + "  `last_push_time` datetime DEFAULT NULL COMMENT '账户推送时间',\n"
                    + "  `create_time` datetime NOT NULL COMMENT '创建时间',\n"
                    + "  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',\n"
                    + "  PRIMARY KEY (`id`) USING BTREE,\n"
                    + "  UNIQUE KEY `idx_account_num` (`account_num`) USING BTREE\n"
                    + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=COMPACT COMMENT='账户信息表';",

            }) {
                SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
                List<SQLStatement> statementList = parser.parseStatementList();
                System.out.println(statementList);
                //assertEquals(1, statementList.size());
                SQLParseAssertUtil.assertParseSql(sql, dbType);
            }
        }
    }

Stacktrace Info

No response

Error Info

json DEFAULT (_utf8mb4'{}')
解析之后生成的sql语句里,变成了

json DEFAULT _utf8mb4' {}'

需要保留原始的编码信息和括号。

lizongbo added a commit to lizongbo/druid that referenced this issue Aug 19, 2024
优化MySQL8.x的json类型字段默认值解析逻辑 alibaba#6102
wenshao pushed a commit that referenced this issue Aug 19, 2024
优化MySQL8.x的json类型字段默认值解析逻辑 #6102
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant