2013-09-03 17 views
10

Esiste una modalità sql che restituirà un errore invece di convertire implicitamente la stringa in intero?modalità rigorosa per evitare la conversione del tipo

mysql> select * from todel ; 
+------+--------+ 
| id | name | 
+------+--------+ 
| 1 | abc | 
| 2 | xyz | 
| 0 | ABCxyz | 
+------+--------+ 
3 rows in set (0.00 sec) 

mi aspetto un messaggio di errore invece di una riga con id 0

mysql> select * from todel where id = 'abc'; 
+------+--------+ 
| id | name | 
+------+--------+ 
| 0 | ABCxyz | 
+------+--------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+-----------------------------------------+ 
| Level | Code | Message         | 
+---------+------+-----------------------------------------+ 
| Warning | 1292 | Truncated incorrect DOUBLE value: 'abc' | 
+---------+------+-----------------------------------------+ 
1 row in set (0.01 sec) 
+0

In alternativa è possibile migrare a un database che rifiuta tale dichiarazione;) –

risposta

3

Comprendo le vostre preoccupazioni, ma è proprio per questo motivo si dovrebbe mai avere un set id a 0. A lungo termine, penso che dovresti riconsiderare le righe della tabella prima del comportamento che non è un problema in situazioni ideali. Non ho trovato nulla di rilevante in questo attraverso una piccola ricerca, e probabilmente è perché probabilmente non è un problema a meno che tu non ne faccia uno.

A parte questo, è possibile leggere i dati delle colonne rilevanti e agire di conseguenza in php/whatev. Dalla tabellain information_schema, è possibile filtrare per TABLE_SCHEMA (database), TABLE_NAME e COLUMN_NAME per ottenere DATATYPE (doppio). Se la colonna che stai modificando ha un certo DATATYPE, lascia che lo script dia un errore prima di eseguire la query MySQL.

Un altro modo per farlo sarebbe semplicemente convertire input prima analisi:

if (! is_numeric($id)) 
    $id = 'NULL'; 

per evitare errati INSERT s o UPDATE s, è già have that mode.


alla fine non posso venire con molti aspetti pratici che questa modalità rigorosa che cercate potrebbe beneficiare gli utenti di MySQL.

1

È possibile utilizzare la modalità STRICT_ALL_TABLES sql:

set @@GLOBAL.sql_mode = "STRICT_ALL_TABLES"; 
set @@SESSION.sql_mode = "STRICT_ALL_TABLES"; 

tuttavia funziona solo su operazioni di scrittura:

MariaDB [(none)]> insert into test.test values ("abc", "lol"); 
-------------- 
insert into test.test values ("abc", "lol") 
-------------- 

ERROR 1366 (22007): Incorrect integer value: 'abc' for column 'id' at row 1 

Non v'è nulla di simile per disabilitare conversioni implicite per le query di lettura; puoi invece controllare se ci sono avvertimenti e se sì, solo liberare il risultato, annullare la dichiarazione e minacciare quegli avvertimenti come errori.

+0

Non si tratta dell'INSERTO, si tratta del confronto 'integer_column = string_literal' –

+0

@a_horse_with_nomome non deve essere inserito, può essere aggiornato, sostituire , qualunque operazione di scrittura. l'operazione di butread come SELECT implicherà sempre la conversione implicita tra i tipi di dati. – Zaffy

+0

Quindi stai dicendo che MariaDB con 'STRICT_ALL_TABLES' rifiuterà un'istruzione con un errore che usa' where id = 'abc'' (con 'id' è una colonna' integer'). –

Problemi correlati