記事ディレクトリ
1. エラーを再現する
現在、ローコード インターフェイスをデバッグしているときに、次のエラーが突然報告されます。
すなわちYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 )' at line 11
。
したがって、次の図に示すように、コンソールによって報告される詳細なエラー情報を確認してください。
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 )' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1348)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:241)
at com.test.AppModelPageService.addData(AppModelPageService.java:904)
at com.test.AppModelPageService$$FastClassBySpringCGLIB$$81597048.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at com.test.AppModelPageService$$EnhancerBySpringCGLIB$$40f27572.addData(<generated>)
at com.sugon.cloud.lowcode.controller.AppModelPageController.AddData(AppModelPageController.java:125)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)
......
2. 分析エラー
java.sql.SQLSyntaxErrorException
これはSQL
報告された文法上の誤りであることがわかります。
SQL
次の図に示すように、出力されたログを見つけます。
次の図に示すように、赤いボックス内のMySQL
ステートメントをコンソールにコピーして実行します。MySQL
私はかなり確信していますinsert into project(remark,desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 );
、MySQL
そのステートメントには構文エラーはありません。
MySQL关键字
ステートメントに競合するフィールドがあるかどうかのみを考慮することができます。
よく見ると、次のコードに示すように、降順を示すキーワードdesc
です。MySQL
select * from product order by price desc;
3.バグを修正
上記の分析から、 SQL ステートメントinsert into project(remark,desc,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 );
内のキーワードdesc
とSQL ステートメントMySQL
内のキーワードがdesc
競合していることがわかります。
したがって、次の 2 つの方法で変更できます。
- 方法1
私のdesc
フィールドをMySQL
キーワードと競合しない他のフィールドnote
に変更します。
- 方法 2
次のコードに示すように、バッククォート (`) を上記のMySQL
ステートメントに追加します。desc
mysql> insert into project(remark,`desc`,name,is_deleted ) VALUES('测试哈','测试哈','测试项目',1 );
Query OK, 1 row affected (0.01 sec)
したがって、実際の開発では、追加、変更、クエリなどのフィールドにバッククォート (`) を追加するのが最善です。
MySQL
自分のキーワードと競合しないようにして、不必要なトラブルを減らします。
4. このエラーを解決するその他の方法
私の間違いは、ステートメントにキーワードと競合するフィールドがinsert
あり、競合するフィールドに単一引用符を追加することで問題を解決できるためです。MySQL
エラーの原因がこの理由でない場合は、次の解決策を参照してください。
- 一重引用符と逆一重引用符は区別できません
java
一重引用符 (') はキー値に使用され、一重引用符 (`) は列名に使用されます。
ed.insertData("insert into information(`nowtime`,`data`) values(current_time,'A');");
insertData
このステートメントを実行する責任がありSQL
、最終的に影響を受けるアイテムの数が返されるので、心配する必要はありません。
の:
-
列名は
nowtime
andですdata
(ここでは一重引用符を使用します) -
データベースに書き込まれる値は、
current_time
アンパサンド文字A
(ここでは単一引用符) です。
- true が構文エラーかどうかを確認する
これは普通に見られます。
- ステートメントがスペースを忘れているかどうかを確認します
次のエラーが報告されます。
int result = ed.insertData("insert "+"into test"
+ "values(1) ");
以下に示すように、コードを 1 つの文にまとめて実行しても問題ありません。
int result = ed.insertData("insert into test values(1) ");
最初の文test
と次の の間にスペースはありませんvalues
ので、当然エラーが報告されます。
スペースを忘れていないか注意してください. このエラーは改行時によく発生します.
したがって、生産効率を下げるためには、短い文章を 1 つの文としてSQL
作成する方がよいでしょうbug
。