Prima valoare MySQL interpretată ca nume de coloană

Folosind JDBC, încerc să execut următoarea instrucțiune SQL:

INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES (SomeString,6,4794,1,76)

Dar aceasta returnează eroarea

Coloana necunoscută "SomeString" în "lista de câmpuri"

Deci se pare că prima dintre valori este interpretată ca o coloană, cum e asta?

Deja am verificat structura tabelului, poate că tocmai am tunat-o pe asta, dar nu prea par să găsesc cauza acestei probleme.

1
Încercați "SomeString" în loc de SomeString.
adăugat autor Peter Rader, sursa
String în variabilele citate fără citate :)
adăugat autor Sanyam Goel, sursa
String în variabilele citate fără citate :)
adăugat autor Sanyam Goel, sursa
ați adăugat citate la șirul dvs.?
adăugat autor duffy356, sursa
ați adăugat citate la șirul dvs.?
adăugat autor duffy356, sursa
încercați "someString" în schimb
adăugat autor justMe, sursa
încercați "someString" în schimb
adăugat autor justMe, sursa

10 răspunsuri

Se pare că prima dintre valori este interpretată ca o coloană, cum este asta?

Deoarece ați primit-o la fel ca SomeString , în loc de text valoare , cum ar fi 'SomeString' . Acesta este modul în care funcționează SQL - și cum funcționează și codul normal, într-adevăr. Daca ai fi avut:

String foo = bar;

v-ați aștepta să încercați să copiați valoarea unei variabile numite bar , nu-i așa? Dacă ați însemnat un șir de trei caractere, b, a, r, ați folosi:

String foo = "bar";

Este același lucru în SQL.

Cu toate acestea, presupunând că acest SQL este construit din valori reale, ar trebui să utilizați oricum un parametru PreparedStatement cu parametri:

String sql = "INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount)"
             + " VALUES (?, ?, ?, ?, ?)";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, "SomeString");
pst.setInt(2, 6);
// etc

În acest fel, veți evita atacurile de injecție SQL și problemele de conversie a șirului (de exemplu, pentru date). De asemenea, vă păstrează curățarea SQL, separând codul de date.

5
adăugat

Se pare că prima dintre valori este interpretată ca o coloană, cum este asta?

Deoarece ați primit-o la fel ca SomeString , în loc de text valoare , cum ar fi 'SomeString' . Acesta este modul în care funcționează SQL - și cum funcționează și codul normal, într-adevăr. Daca ai fi avut:

String foo = bar;

v-ați aștepta să încercați să copiați valoarea unei variabile numite bar , nu-i așa? Dacă ați însemnat un șir de trei caractere, b, a, r, ați folosi:

String foo = "bar";

Este același lucru în SQL.

Cu toate acestea, presupunând că acest SQL este construit din valori reale, ar trebui să utilizați oricum un parametru PreparedStatement cu parametri:

String sql = "INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount)"
             + " VALUES (?, ?, ?, ?, ?)";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, "SomeString");
pst.setInt(2, 6);
// etc

În acest fel, veți evita atacurile de injecție SQL și problemele de conversie a șirului (de exemplu, pentru date). De asemenea, vă păstrează curățarea SQL, separând codul de date.

5
adăugat

String-ul ar trebui să se încadreze în citate simple (").

INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES ('SomeString',6,4794,1,76)
2
adăugat

String-ul ar trebui să se încadreze în citate simple (").

INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES ('SomeString',6,4794,1,76)
2
adăugat

când vreți să introduceți date sau valsaui de șir pe care trebuie să le includeți

fie "" (citate unică) [utilizați întotdeauna acest lucru]

sau "" (caracterele din spate) [nu întotdeauna]

INSERTAȚI ÎN meta (titlu, hlcount, textcount, imgcount, linkcount) VALUES ("SomeString", 6,4794,1,76)

sau

INSCRIEȚI ÎN VALORI ("SomeString", 6,4794,1,76) meta (titlu, hlcount, textcount, imgcount, linkcount)

1
adăugat

când vreți să introduceți date sau valsaui de șir pe care trebuie să le includeți

fie "" (citate unică) [utilizați întotdeauna acest lucru]

sau "" (caracterele din spate) [nu întotdeauna]

INSERTAȚI ÎN meta (titlu, hlcount, textcount, imgcount, linkcount) VALUES ("SomeString", 6,4794,1,76)

sau

INSCRIEȚI ÎN VALORI ("SomeString", 6,4794,1,76) meta (titlu, hlcount, textcount, imgcount, linkcount)

1
adăugat

Puneți citate în jurul lui SomeString.

INSERT INTO meta 
  (title, hlcount, textcount, imgcount, linkcount) 
VALUES ('SomeString',6,4794,1,76)

Aceasta va determina motorul să-l trateze ca pe o literă stringală. În caz contrar, se presupune că este ceva care poate fi rezolvat printr-un nume de coloană.

1
adăugat

Puneți citate în jurul lui SomeString.

INSERT INTO meta 
  (title, hlcount, textcount, imgcount, linkcount) 
VALUES ('SomeString',6,4794,1,76)

Aceasta va determina motorul să-l trateze ca pe o literă stringală. În caz contrar, se presupune că este ceva care poate fi rezolvat printr-un nume de coloană.

1
adăugat

trebuie să utilizați cotații single "Somestring".

 INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES  ('SomeString',6,4794,1,76)  

deoarece SomeString desemnează valoarea textului care trebuie inserată în coloana titlu și textul ar trebui întotdeauna să fie înconjurat de citate simple.

1
adăugat

trebuie să utilizați cotații single "Somestring".

 INSERT INTO meta (title, hlcount, textcount, imgcount, linkcount) VALUES  ('SomeString',6,4794,1,76)  

deoarece SomeString desemnează valoarea textului care trebuie inserată în coloana titlu și textul ar trebui întotdeauna să fie înconjurat de citate simple.

1
adăugat