diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4 b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
index cc7682cb19748..555ddf2aa2dee 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
@@ -33,6 +33,7 @@ customKeyword
| POSITION
| SUBSTRING
| SUBSTR
+ | MID
| EXTRACT
| TRIM
| LAST_DAY
@@ -1113,8 +1114,8 @@ positionFunction
;
substringFunction
- : (SUBSTRING | SUBSTR) LP_ expr FROM NUMBER_ (FOR NUMBER_)? RP_
- | (SUBSTRING | SUBSTR) LP_ expr COMMA_ NUMBER_ (COMMA_ NUMBER_)? RP_
+ : (SUBSTRING | SUBSTR | MID) LP_ expr FROM NUMBER_ (FOR NUMBER_)? RP_
+ | (SUBSTRING | SUBSTR | MID) LP_ expr COMMA_ NUMBER_ (COMMA_ NUMBER_)? RP_
;
extractFunction
diff --git a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4 b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
index 882e72c3fe0a1..081f2c5e5730e 100644
--- a/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
+++ b/parser/sql/dialect/mysql/src/main/antlr4/imports/mysql/Keyword.g4
@@ -60,6 +60,10 @@ SUBSTR
: S U B S T R
;
+MID
+ : M I D
+ ;
+
EXTRACT
: E X T R A C T
;
diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
index 648a744b71e84..5a230c4d7463a 100644
--- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
+++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -1099,7 +1099,8 @@ public final ASTNode visitPositionFunction(final PositionFunctionContext ctx) {
@Override
public final ASTNode visitSubstringFunction(final SubstringFunctionContext ctx) {
FunctionSegment result = new FunctionSegment(
- ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), null == ctx.SUBSTR() ? ctx.SUBSTRING().getText() : ctx.SUBSTR().getText(), getOriginalText(ctx));
+ ctx.getStart().getStartIndex(),
+ ctx.getStop().getStopIndex(), null == ctx.SUBSTR() ? null == ctx.SUBSTRING() ? ctx.MID().getText() : ctx.SUBSTRING().getText() : ctx.SUBSTR().getText(), getOriginalText(ctx));
result.getParameters().add((ExpressionSegment) visit(ctx.expr()));
for (TerminalNode each : ctx.NUMBER_()) {
result.getParameters().add(new LiteralExpressionSegment(each.getSymbol().getStartIndex(), each.getSymbol().getStopIndex(), new NumberLiteralValue(each.getText()).getValue()));
diff --git a/test/it/parser/src/main/resources/case/dml/select-special-function.xml b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
index 8c8c7235754f4..d61745a251638 100644
--- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
@@ -3020,4 +3020,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
index fe08fe5f763b9..f6c87df785968 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
@@ -180,4 +180,15 @@
+
+
+
+
+
+
+
+
+
+
+