2009-11-04 9 views
2

Je suis encore un peu nouveau sur Java et j'essaie d'insérer des données dans une base de données. Je reçois une erreur lors de l'insertion d'une chaîne contenant des s si mon résultat final serait d'échapper à l'apostrophe. Comment puis-je accomplir?Echapper à une apostrophe en Java

+3

« Le point crucial du biscuit est lapostrophe » - FZ –

Répondre

5

En utilisant StringEscapeUtils:

StringEscapeUtils.escapeSql(yourstring); 

Attention: Comme des communes Lang 3.0:

StringEscapeUtils.escapeSql

Cette méthode était trompeuse, ne traitant que les cas SQL les plus simples possibles. Comme SQL n'est pas l'accent de Lang, cela n'a pas de sens de maintenir cette méthode.

+0

C'est exactement ce que je cherchais. – jkushner

+0

Même si je suis d'accord que l'utilisation de escapeSql peut avoir des négatifs, il y a des endroits où les instructions préparées ne fonctionnent pas bien. Par exemple, créer une insertion de plusieurs lignes. Cela étant dit, certains pilotes db vous permettront de combiner plusieurs instructions préparées dans un lot, puis de les convertir automatiquement en une seule instruction plus efficace. Savoir lequel utiliser quand peut prendre quelques recherches. – RHSeeger

0

Cela dépend de la base de données que vous utilisez. Habituellement '' fonctionne (je n'ai que des connaissances de première main avec SQL Server).

Quelle base de données utilisez-vous?

+0

J'utilise MySQL – jkushner

2

Dépend de la base de données, mais vous pouvez utiliser '' dans SqlServer.

EDIT: En MySql vous pouvez utiliser un double ou un antislash apostrophe: http://www.faqts.com/knowledge_base/view.phtml/aid/630

+0

double apostrophe dans postgres –

+0

Et je suis d'accord avec James dans le commentaire: utiliser des déclarations préparées. Meilleure solution à long terme. –

13

Utilisez préparé des déclarations. En plus de gérer tous les caractères spéciaux, ils sont beaucoup plus robustes et aident à prévenir les attaques par injection SQL.

+1

+1 Cette réponse va au cœur du problème: le codage manuel de votre propre SQL dans vos appels de méthode est une mauvaise pratique, et vous ouvre à de nombreux problèmes de sécurité. – rtperson

+0

Une bonne habitude à prendre, mais peut-être trop pour apprendre la langue. –

+3

... il suffit de demander à Little Bobby Tables. :) – rtperson

6

Le problème n'est pas vraiment avec Java, mais plutôt avec la base de données sous-jacente. Très probablement, vous enchaînez vos paramètres ensemble comme ceci:

String sql = "select * from sometable where somefield = " + someObject.getSomeField(); 

Ne faites pas cela. Utilisez PreparedStatement à la place.

Cela a l'avantage supplémentaire de prévenir les attaques par injection SQL, s'il s'agit d'une application qui doit être concernée par de telles choses.

+0

+1: non seulement elle vous évite les attaques par injection SQL, mais elle facilite également la définition d'objets Java dans une instruction SQL (Date, InputStream, etc.) et est techniquement aussi plus performant (précompilé chez DB). – BalusC

1

Je suppose que vous utilisez un java.sql.Statement et appelez la méthode executeQuery avec une chaîne. C'est mauvais, car il est possible de faire une injection SQL. Vous devez utiliser un java.sql.PreparedStatement à la place, puis vous pouvez définir n'importe quelle chaîne que vous voulez en tant que paramètre et vous n'aurez pas votre problème.

Par exemple:

PreparedStatement pstmt = con.prepareStatement("UPDATE MY_TABLE SET TEXT_FIELD = ?"); 
pstmt.setString(1, "any String 'will work here!");