This is an automated email from the ASF dual-hosted git repository.
jimin pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/incubator-seata.git
The following commit(s) were added to refs/heads/2.x by this push:
new 82b036fc8e bugfix: convert to utf8mb4 if mysql column is json type
(#6232)
82b036fc8e is described below
commit 82b036fc8e5bb067f4cfee933a747b27878a34d6
Author: justabug <[email protected]>
AuthorDate: Tue Jan 16 19:53:52 2024 +0800
bugfix: convert to utf8mb4 if mysql column is json type (#6232)
---
changes/en-us/2.x.md | 3 +-
changes/zh-cn/2.x.md | 3 +-
.../rm/datasource/undo/mysql/MySQLJsonHelper.java | 37 ++++++++++++++++++++++
.../undo/mysql/MySQLUndoDeleteExecutor.java | 2 +-
.../undo/mysql/MySQLUndoUpdateExecutor.java | 7 ++--
5 files changed, 47 insertions(+), 5 deletions(-)
diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index 53759c4f3b..b1b114e418 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -18,7 +18,8 @@ Add changes here for all PR submitted to the 2.x branch.
- [[#6143](https://github.com/apache/incubator-seata/pull/6143)] gracefully
shut down the server
- [[#6204](https://github.com/apache/incubator-seata/pull/6204)] fix the
problem that The incorrect configuration needs to be fixed
- [[#6248](https://github.com/apache/incubator-seata/pull/6248)] fix JDBC
resultSet, statement, connection closing order
-- [[#6248](https://github.com/apache/incubator-seata/pull/6256)] fix
raft-discovery cannot read registry configuration for seata-all sdk
+- [[#6256](https://github.com/apache/incubator-seata/pull/6256)] fix
raft-discovery cannot read registry configuration for seata-all sdk
+- [[#6232](https://github.com/apache/incubator-seata/pull/6232)] convert to
utf8mb4 if mysql column is json type
### optimize:
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index 502f8afbe9..ebeec80036 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -18,7 +18,8 @@
- [[#6143](https://github.com/apache/incubator-seata/pull/6143)] 修复优雅停机
- [[#6204](https://github.com/apache/incubator-seata/pull/6204)] 修复错误配置问题
- [[#6248](https://github.com/apache/incubator-seata/pull/6248)] 修复JDBC
resultSet, statement, connection关闭顺序
-- [[#6248](https://github.com/apache/incubator-seata/pull/6256)] 修复在seata-all
sdk下,raft-discovery模块不能读取registry.conf的配置的问题
+- [[#6256](https://github.com/apache/incubator-seata/pull/6256)] 修复在seata-all
sdk下,raft-discovery模块不能读取registry.conf的配置的问题
+- [[#6232](https://github.com/apache/incubator-seata/pull/6232)]
修复在mysql的json类型下出现Cannot create a JSON value from a string with CHARACTER SET
'binary'问题
### optimize:
- [[#6031](https://github.com/apache/incubator-seata/pull/6031)]
添加undo_log表的存在性校验
diff --git
a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLJsonHelper.java
b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLJsonHelper.java
new file mode 100644
index 0000000000..90a083b756
--- /dev/null
+++
b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLJsonHelper.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.seata.rm.datasource.undo.mysql;
+
+import io.seata.rm.datasource.sql.struct.Field;
+import io.seata.sqlparser.struct.ColumnMeta;
+import io.seata.sqlparser.struct.TableMeta;
+
+import java.sql.Types;
+
+/**
+ * the type MySQLJsonHelper
+ **/
+public class MySQLJsonHelper {
+ public static String convertIfJson(Field field, TableMeta tableMeta) {
+ ColumnMeta columnMeta = tableMeta.getColumnMeta(field.getName());
+ if (columnMeta != null && columnMeta.getDataType() == Types.OTHER
+ && "JSON".equals(columnMeta.getDataTypeName())) {
+ return "CONVERT(? USING utf8mb4)";
+ }
+ return "?";
+ }
+}
diff --git
a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoDeleteExecutor.java
b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoDeleteExecutor.java
index 9ebf829b4f..29638bbdb3 100644
---
a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoDeleteExecutor.java
+++
b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoDeleteExecutor.java
@@ -74,7 +74,7 @@ public class MySQLUndoDeleteExecutor extends
AbstractUndoExecutor {
String insertColumns = fields.stream()
.map(field -> ColumnUtils.addEscape(field.getName(),
JdbcConstants.MYSQL))
.collect(Collectors.joining(", "));
- String insertValues = fields.stream().map(field -> "?")
+ String insertValues = fields.stream().map(field ->
MySQLJsonHelper.convertIfJson(field, beforeImage.getTableMeta()))
.collect(Collectors.joining(", "));
return String.format(INSERT_SQL_TEMPLATE, sqlUndoLog.getTableName(),
insertColumns, insertValues);
diff --git
a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoUpdateExecutor.java
b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoUpdateExecutor.java
index e58cb5e22b..5ccfee9aa9 100644
---
a/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoUpdateExecutor.java
+++
b/rm-datasource/src/main/java/io/seata/rm/datasource/undo/mysql/MySQLUndoUpdateExecutor.java
@@ -59,8 +59,11 @@ public class MySQLUndoUpdateExecutor extends
AbstractUndoExecutor {
// update sql undo log before image all field come from table meta.
need add escape.
// see BaseTransactionalExecutor#buildTableRecords
String updateColumns = nonPkFields.stream().map(
- field -> ColumnUtils.addEscape(field.getName(),
JdbcConstants.MYSQL) + " = ?").collect(
- Collectors.joining(", "));
+ field -> {
+ String addEscape = ColumnUtils.addEscape(field.getName(),
JdbcConstants.MYSQL);
+ return addEscape + " = " +
MySQLJsonHelper.convertIfJson(field, beforeImage.getTableMeta());
+ })
+ .collect(Collectors.joining(", "));
List<String> pkNameList = getOrderedPkList(beforeImage, row,
JdbcConstants.MYSQL).stream().map(e -> e.getName())
.collect(Collectors.toList());
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]