[JAVA] Escape-Verarbeitung bei der Suche nach LIKE

2017/9/1 Der Artikel wurde überarbeitet, nachdem @Kilisame darauf hingewiesen hatte. Vielen Dank für den Hinweis.

Was ist in diesem Artikel bekannt

Hinweis

Bitte beachten Sie, dass die Symbole, die maskiert werden müssen, je nach verwendeter Datenbank variieren. Diese Zeit ist ein Beispiel für die Verwendung von MariaDB.

Kommentar

Angenommen, Sie haben eine solche "Produktlistentabelle".

Produkt ID Produktname
1 Cola
2 Orange 100%
3 Milch
4 Apple 100%
5 Milch_fettarm
6 Saft für 100 Orangen
7 Saft für 100 Äpfel

Hier ist die SQL-Anweisung, die in die Datenbank eingefügt werden soll.

in Produktliste einfügen(Produkt ID,Produktname) values ('1', 'Cola'),
('2', 'Orange 100%'),
('3', 'Milch'),
('4', 'Apple 100%'),
('5', 'Milch_fettarm'),
('6', 'Saft für 100 Orangen'),
('7','Saft für 100 Äpfel');

Hier ist die SQL-Anweisung, die eine teilweise Übereinstimmungssuche für diese "Produktlistentabelle" durchführt. [1] Teilweise Übereinstimmung mit "Milch"

Wählen Sie Produkt-ID,Produktname aus Produktliste, wo Produktname gefällt'%Milch%';

[2] Teilweise Übereinstimmung mit "100%"

Wählen Sie Produkt-ID,Produktname aus Produktliste, wo Produktname gefällt'%100\%%';

Ergebnis

Produkt ID Produktname
2 Orange 100%
4 Apple 100%

[3] Teilweise Übereinstimmung mit "_ fettarm"

Wählen Sie Produkt-ID,Produktname aus Produktliste, wo Produktname gefällt'%\_fettarm%';

Ergebnis

Produkt ID Produktname
5 Milch_fettarm

Da die Symbole "%" und "_" eine besondere Bedeutung für die Datenbank haben, kann die beabsichtigte Suche nach Teilübereinstimmungen nur durchgeführt werden, wenn das Escape-Symbol "" wie in [2] und [3] davor hinzugefügt wird. Als Test habe ich eine LIKE-Suche ohne das Escape-Symbol versucht.

【4】

Wählen Sie Produkt-ID,Produktname aus Produktliste, wo Produktname gefällt'%100%%';

Ergebnis

Produkt ID Produktname
2 Orange 100%
4 Apple 100%
6 Saft für 100 Orangen
7 Saft für 100 Äpfel

Wenn Sie die Suchverarbeitung in Ihrer Anwendung implementieren möchten, müssen Sie daher die Verarbeitung für das Suchzielwort umgehen.

Beispielcode

public void getName(String word){
    Connection con = null;
    String sql = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try{
        con = this.getConnection();
        sql = "Wählen Sie den Produktnamen aus der Produktliste aus, wo der Produktname gefällt?";
        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

Escape-Verarbeitung bei der Suche nach LIKE
Escape-Verarbeitung beim Erstellen einer URL in Ruby
Wenn SimpleDateFormat wie ٢٠١٨١٠٠٤٠٨٣١٣٣٦٥٧ verstümmelt ist