Zum Beispiel:
select * from tablename where fields like "%string "hi" %";
Error:
Sie haben einen Fehler in Ihrer SQL-Syntax. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für die Verwendung in der Nähe von 'hi "" in Zeile 1
Wie erstelle ich diese Abfrage?
Antworten:
Siehe http://dev.mysql.com/doc/refman/5.0/en/string-literals.html
Also brauchst du
select * from tablename where fields like "%string \"hi\" %";
Obwohl, wie Bill Karwin weiter unten bemerkt , die Verwendung von doppelten Anführungszeichen für Zeichenfolgenbegrenzer kein Standard-SQL ist, empfiehlt es sich, einfache Anführungszeichen zu verwenden. Dies vereinfacht die Dinge:
select * from tablename where fields like '%string "hi" %';
quelle
Ich habe meine eigene MySQL-Escape-Methode in Java entwickelt (falls für irgendjemanden nützlich).
Siehe Klassencode unten.
Warnung: falsch, wenn der SQL-Modus NO_BACKSLASH_ESCAPES aktiviert ist.
private static final HashMap<String,String> sqlTokens; private static Pattern sqlTokenPattern; static { //MySQL escape sequences: http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html String[][] search_regex_replacement = new String[][] { //search string search regex sql replacement regex { "\u0000" , "\\x00" , "\\\\0" }, { "'" , "'" , "\\\\'" }, { "\"" , "\"" , "\\\\\"" }, { "\b" , "\\x08" , "\\\\b" }, { "\n" , "\\n" , "\\\\n" }, { "\r" , "\\r" , "\\\\r" }, { "\t" , "\\t" , "\\\\t" }, { "\u001A" , "\\x1A" , "\\\\Z" }, { "\\" , "\\\\" , "\\\\\\\\" } }; sqlTokens = new HashMap<String,String>(); String patternStr = ""; for (String[] srr : search_regex_replacement) { sqlTokens.put(srr[0], srr[2]); patternStr += (patternStr.isEmpty() ? "" : "|") + srr[1]; } sqlTokenPattern = Pattern.compile('(' + patternStr + ')'); } public static String escape(String s) { Matcher matcher = sqlTokenPattern.matcher(s); StringBuffer sb = new StringBuffer(); while(matcher.find()) { matcher.appendReplacement(sb, sqlTokens.get(matcher.group(1))); } matcher.appendTail(sb); return sb.toString(); }
quelle
Sie sollten einfache Anführungszeichen für Zeichenfolgenbegrenzer verwenden. Das einfache Anführungszeichen ist das Standard-SQL-Zeichenfolgenbegrenzer, und doppelte Anführungszeichen sind Bezeichnerbegrenzer (Sie können also spezielle Wörter oder Zeichen in den Namen von Tabellen oder Spalten verwenden).
In MySQL funktionieren doppelte Anführungszeichen (nicht standardmäßig) standardmäßig als Zeichenfolgenbegrenzer (es sei denn, Sie legen den
ANSI
SQL-Modus fest). Wenn Sie jemals eine andere Marke von SQL-Datenbanken verwenden, können Sie sich angewöhnen, Anführungszeichen standardmäßig zu verwenden.Ein weiterer praktischer Vorteil der Verwendung von einfachen Anführungszeichen besteht darin, dass die wörtlichen doppelten Anführungszeichen in Ihrer Zeichenfolge nicht maskiert werden müssen:
select * from tablename where fields like '%string "hi" %';
quelle
MySQL hat die String-Funktion QUOTE und sollte dieses Problem lösen:
quelle
LIKE
den%
Charakter, also ist es ziemlich nutzlosQUOTE
Achten Sie auch darauf, dass umgebende einzelne Qoutes für ZeichenfolgenwerteSie können mysql_real_escape_string verwenden .
mysql_real_escape_string()
entkommt nicht%
und_
, daher sollten Sie MySQL-Platzhalter (%
und_
) separat entkommen .quelle
Für solche Zeichenfolgen ist es für mich am bequemsten, das 'oder "zu verdoppeln, wie im MySQL-Handbuch erläutert:
Es ist von http://dev.mysql.com/doc/refman/5.0/en/string-literals.html .
quelle
Um zu testen, wie die doppelten Anführungszeichen mithilfe des Terminals in MySQL eingefügt werden, können Sie Folgendes verwenden:
Nach dem Einfügen des Werts können Sie den Wert in der Datenbank mit doppelten oder einfachen Anführungszeichen aktualisieren:
update table TableName replace(Dstring, "QQ", "\"")
quelle
Wenn Sie beim Suchen in einer Zeichenfolge eine Variable verwenden,
mysql_real_escape_string()
ist dies gut für Sie. Nur mein Vorschlag:$char = "and way's 'hihi'"; $myvar = mysql_real_escape_string($char); select * from tablename where fields like "%string $myvar %";
quelle