[JAVA] Traitement d'échappement lors de la recherche de LIKE

2017/9/1 L'article a été révisé après avoir été signalé par @Kilisame. Merci d'avoir souligné.

Ce qui est connu dans cet article

--Exemple de traitement d'échappement

Mise en garde

Veuillez noter que les symboles à échapper varient en fonction du DB utilisé. Cette fois est un exemple d'utilisation de MariaDB.

Commentaire

Supposons que vous ayez un tableau "Liste des produits" comme celui-ci.

ID produit Nom du produit
1 Cola
2 Orange 100%
3 Lait
4 Pomme 100%
5 Lait_faible en gras
6 Jus pour 100 oranges
7 Jus de 100 pommes

Voici l'instruction SQL à insérer dans la base de données.

insérer dans la liste de produits(ID produit,Nom du produit) values ('1', 'Cola'),
('2', 'Orange 100%'),
('3', 'Lait'),
('4', 'Pomme 100%'),
('5', 'Lait_faible en gras'),
('6', 'Jus pour 100 oranges'),
('7','Jus de 100 pommes');

Voici l'instruction SQL qui effectue une recherche de correspondance partielle pour cette table "Liste de produits". [1] Correspondance partielle avec "lait"

sélectionnez l'ID de produit,Nom du produit de la liste de produits où le nom du produit comme'%Lait%';

[2] Correspondance partielle avec "100%"

sélectionnez l'ID de produit,Nom du produit de la liste de produits où le nom du produit comme'%100\%%';

résultat

ID produit Nom du produit
2 Orange 100%
4 Pomme 100%

[3] Correspondance partielle avec "_ faible en gras"

sélectionnez l'ID de produit,Nom du produit de la liste de produits où le nom du produit comme'%\_faible en gras%';

résultat

ID produit Nom du produit
5 Lait_faible en gras

Les symboles "%" et "_" ont une signification particulière pour le DB, donc la recherche de correspondance partielle prévue ne peut pas être effectuée à moins que le symbole d'échappement "" soit ajouté devant lui, comme dans [2] et [3]. En guise de test, j'ai essayé une recherche LIKE sans le symbole d'échappement,

【4】

sélectionnez l'ID de produit,Nom du produit de la liste de produits où le nom du produit comme'%100%%';

résultat

ID produit Nom du produit
2 Orange 100%
4 Pomme 100%
6 Jus pour 100 oranges
7 Jus de 100 pommes

Par conséquent, si vous souhaitez implémenter le traitement de la recherche dans votre application, vous devez échapper au traitement du mot cible de recherche.

Exemple de code

public void getName(String word){
    Connection con = null;
    String sql = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try{
        con = this.getConnection();
        sql = "sélectionnez le nom du produit dans la liste de produits où le nom du produit comme?";
        ps = con.prepareStatement(sql);
        ps.setString(1, "%" +this.escape(word) + "%");
        rs = ps.executeQuery();
        
        rs.close();
        ps.close();
    }finally{
        if(con != null){
            con.close();
        }
    }
}

public String escape(String before){
    StringBuilder after = new StringBuilder();
		String esSymbol = "\";
		char es1 = '_';
		char es2 = '%';

		for (int i = 0; i < before.length(); i++) {
			if (before.charAt(i) == es1 || before.charAt(i) == es2) {
				after.append(esSymbol);
				after.append(String.valueOf(before.charAt(i)));
				continue;
			}
			after.append(String.valueOf(before.charAt(i)));
		}
		return after.toString();
}

Recommended Posts

Traitement d'échappement lors de la recherche de LIKE
Traitement d'échappement lors de la création d'une URL dans Ruby
Lorsque SimpleDateFormat est déformé comme ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧