Java JDBC with MySQLを使用していますが、次のエラーが発生します:
com.mysql.jdbc.MysqlDataTruncation: Data truncation:
Data too long for column 'column_name'
このエラーを修正するにはどうすればよいですか?
mysqlターミナルでこのエラーを再現する方法:
mysql> create table penguins(val CHAR(2));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into penguins values("AB");
Query OK, 1 row affected (0.00 sec)
mysql> insert into penguins values("ABC");
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------+
| Warning | 1265 | Data truncated for column 'val' at row 1 |
+---------+------+------------------------------------------+
1 row in set (0.00 sec)
これは発生しているエラーですが、MySQLターミナルでは警告として表示され、行を挿入し、サイレントに切り捨てます。
MySQL JDBCはそれほど寛容ではなく、ハードエラーを吐き出し、行を挿入しません。
2ソリューション
挿入するデータ型の容量を増やすか、そこに配置するコンテンツのサイズを小さくしてください。
列のサイズを大きくするための凡例:
If you are using then use this
----------------- --------------
smallint int
int long
TEXT LONGTEXT
LONGTEXT CLOB
CLOB Store the content to disk, and save the filename in the db.
これはかなり明白に思えるかもしれません、そしてそれはそうです。 'column_name'列の値が、その列に収まるよりも大きい行を挿入または更新しようとしたようです。
たとえば、CHARまたはVARCHARの場合、列の定義されたサイズよりも長い文字列がある可能性があります。
これを修正するための選択もやや明白です。格納するデータが列より大きくないことを確認するか(おそらく、格納する前に長い文字列を切り捨てることによって)、データベース列のサイズを大きくします。
データベースに画像ファイルをバイトとして挿入しようとすると、Spring Boot Data JPAアプリケーションで同じ問題が発生し、同じエラーが発生しました。
多くの研究開発の後、私は以下のような解決策を見つけました。
Application.propertiesファイルに以下の行を追加して解決しました
spring.datasource.url=jdbc:mysql://localhost:3306/conweb?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false
それが誰かに役立つことを願っています。
私の場合、アップロードされたデータには引用符( 'と ")が含まれています。そのため、上記と同じ例外が発生します。データ内の引用符を削除すると、テーブルに正常に挿入されます。
Image/Word/PDFファイルのアップロード中にSpringBootアプリケーションで同じ問題が発生し、以下の手順で修正しました。
解決策
スペース要件に従って、Altertableコマンドを使用します。
ALTER TABLE'TABLE_NAME 'MODIFY'FIELD_NAME' MEDIUMBLOB;
注:リンクを保存することを常にお勧めしますが、実際のファイル(サイズが大きい)はDBに保存しないことをお勧めします。
このエラーは、列に挿入しようとしたデータのサイズが大きすぎるために表示されます。
解決策-列サイズを最大に変更します。列のタイプがVARCHARであると仮定して、mySQLで
ALTER TABLE table_name CHANGE COLUMN col_name col_name VARCHAR(1000); //assuming 1000 is enough
ここでつまずいた人にとっては、同様のエラーの別の理由がある可能性があります。
ストアドプロシージャパラメータのタイプが制限要因になる可能性があります。
例:対応する列データ型とMySQLサーバーにLONGTEXTとして送信されるデータがありますが、LONGTEXTデータの送信先のストアドプロシージャのパラメータのタイプはTEXTである可能性があります。この場合、パラメータのデータ型を更新する必要があります