ネットワーク全体で解決する方法は複数あります SQL 構文に誤りがあります; MySQL サーバーに対応するマニュアルを確認してください

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. 方法1

私のdescフィールドをMySQLキーワードと競合しない他のフィールドnoteに変更します。

  1. 方法 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

エラーの原因がこの理由でない場合は、次の解決策を参照してください。

  1. 一重引用符と逆一重引用符は区別できません

java一重引用符 (') はキー値に使用され、一重引用符 (`) は列名に使用されます。

ed.insertData("insert into information(`nowtime`,`data`) values(current_time,'A');");

insertDataこのステートメントを実行する責任がありSQL、最終的に影響を受けるアイテムの数が返されるので、心配する必要はありません。

の:

  • 列名はnowtimeandですdata(ここでは一重引用符を使用します)

  • データベースに書き込まれる値は、current_timeアンパサンド文字A(ここでは単一引用符) です。

  1. true が構文エラーかどうかを確認する

これは普通に見られます。

  1. ステートメントがスペースを忘れているかどうかを確認します

次のエラーが報告されます。

int result = ed.insertData("insert "+"into test"
    			+ "values(1) ");

以下に示すように、コードを 1 つの文にまとめて実行しても問題ありません。

int result = ed.insertData("insert into test values(1) ");

最初の文testと次の の間にスペースはありませんvaluesので、当然エラーが報告されます。

スペースを忘れていないか注意してください. このエラーは改行時によく発生します.

したがって、生産効率を下げるためには、短い文章を 1 つの文としてSQL作成する方がよいでしょうbug

おすすめ

転載: blog.csdn.net/lvoelife/article/details/130108739