2011-11-17 12 views
5

Sto utilizzando java e MySQL. Sto cercando di inserire un valore in una tabella.MysqlDataTruncation: troncamento dati: valore fuori intervallo per colonna "colonna" nella riga 1

Quando inserisco, ottengo questa eccezione:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of 
range value for column 'idPxxx' at row 1 

Solo il 5% degli inserti produce questa eccezione, altri lavorano. Cosa significa l'errore e come lo prevengo?

+1

vedi questa domanda http://stackoverflow.com/questions/73109/mysql-data-truncation-error –

risposta

9

Significa che i dati che si stanno memorizzando in idPxxx non si adattano. Ad esempio una stringa potrebbe essere troppo lunga o un numero troppo grande.

Qual è il tipo di dati di idPxxx? E cosa stai cercando di archiviare?

+0

Grazie, è quello che ho pensato, ma questo problema si verifica solo al 5% dei dati inviati e quando ripeto il test accade lo stesso. – Khaledez

+0

@ Khaledez come mai non hai risposto alle domande che ho posto nella mia risposta? – Ariel

+0

Il tipo di dati è 'Unsigned INT (64)' e sto cercando di inserire il valore '2000'. Ancora una volta sto inserendo nella tabella 'X' che ha una chiave esterna' idPxxx' dalla tabella 'Y' e il valore di' idPxxx' è presente nella tabella 'Y'. – Khaledez

2

Come produrre questa eccezione sulla console di MySQL:

mysql> create table penguin (mydecimal decimal(9,8)); 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into penguin values (1234.1234); 
Query OK, 1 row affected, 1 warning (0.01 sec) 

mysql> show warnings; 
+---------+------+----------------------------------------------------+ 
| Level | Code | Message           | 
+---------+------+----------------------------------------------------+ 
| Warning | 1264 | Out of range value for column 'mydecimal' at row 1 | 
+---------+------+----------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select * from penguin; 
+------------+ 
| mydecimal | 
+------------+ 
| 9.99999999 | 
+------------+ 
1 row in set (0.00 sec) 

Si è cercato di stipare 1234 in una colonna che potrebbe trarre il massimo 9.9 ripetuto. Si noti che la riga è ancora inserita.

È possibile ottenere la console di MySQL per evitare che questa conversione utilizzando la modalità rigorosa:

mysql> set sql_mode=STRICT_ALL_TABLES; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into penguin values (5678.5678); 
ERROR 1264 (22003): Out of range value for column 'mydecimal' at row 1 

L'inserto comando non è riuscito nel tentativo aggiungere una seconda fila al pinguino:

mysql> select * from penguin; 
+------------+ 
| mydecimal | 
+------------+ 
| 9.99999999 | 
+------------+ 
1 row in set (0.00 sec) 

Solutions

  1. Espandi la dimensione del tipo di dati nella colonna per accettare il valore inserito.
  2. Riduci le dimensioni del valore che stai cercando di racchiudere in un piccolo tipo di dati.
0

Per me il problema era di tipo di dati non firmati, rimuovere la bandiera ha risolto il problema.

Problemi correlati