Wie füge ich einen Wert ein, der ein Apostroph enthält (einfaches Anführungszeichen)?

310

Was ist die richtige SQL-Syntax, um einen Wert mit einem Apostroph einzufügen?

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'

Ich erhalte immer wieder eine Fehlermeldung, da ich denke, dass der Apostroph nach dem O das End-Tag für den Wert ist.

Leora
quelle
16
Bitte bestätigen Sie, dass Sie sich nicht für SQL-Injection-Angriffe öffnen. Verwenden Sie nach Möglichkeit Parameter.
Andrew
Welche Skriptsprache verwenden Sie? In PHP gibt es beispielsweise Funktionen, um dies für Sie richtig zu machen.
Philfreo
Hier mit Andrew einverstanden: Ich hoffe, diese Frage bezieht sich nur auf die Ausführung von SQL über einen SQL-Client oder einen "Abfragebrowser" oder dergleichen und nicht tatsächlich irgendwo im Produktionscode. Keine parametrisierten Anweisungen zu verwenden, ist Torheit.
Charstar
Es ist tatsächlich im Code. Wenn ich eine parametrisierte Abfrage hätte, müsste ich dann nicht dasselbe tun?
Leora
2
Negativ. Abhängig von der Datenbank und dem von Ihnen verwendeten Treiber wird die Isolierung der Parameter möglicherweise unterschiedlich behandelt, aber Parameter in einer parametrisierten Anweisung müssen nicht maskiert werden. Siehe en.wikipedia.org/wiki/SQL_injection#Preventing_SQL_injection
charstar

Antworten:

485

Entfliehen Sie dem Apostroph (dh verdoppeln Sie das einfache Anführungszeichen) in Ihrem SQL:

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  

Gleiches gilt für SELECT-Abfragen:

SELECT First, Last FROM Person WHERE Last = 'O''Brien'

Das Apostroph oder einfache Anführungszeichen ist ein Sonderzeichen in SQL, das den Anfang und das Ende von Zeichenfolgendaten angibt. Dies bedeutet, dass Sie escapedas Sonderzeichen benötigen, um es als Teil Ihrer Literalzeichenfolgendaten zu verwenden. Mit einem einfachen Angebot wird dies normalerweise erreicht, indem Sie Ihr Angebot verdoppeln. (Zwei einfache Anführungszeichen, kein doppeltes Anführungszeichen anstelle eines einfachen Anführungszeichens.)

Hinweis : Sie sollten sich immer nur über dieses Problem Gedanken machen, wenn Sie Daten manuell über eine unformatierte SQL-Schnittstelle bearbeiten, da das Schreiben von Abfragen außerhalb von Entwicklung und Test selten vorkommt. Im Code gibt es Techniken und Frameworks (abhängig von Ihrem Stack), die dafür sorgen, dass Sonderzeichen, SQL-Injection usw. nicht berücksichtigt werden .

Paul Sasik
quelle
6
$ linkQuestion = str_replace ("'", "' '", $ linkQuestion); (Meine Güte, das ist schwer zu lesen!)
user462990
Was ist, wenn die Daten in Person einfügen? (Erste, Letzte) Werte 'Joe', 'Vaters Laden'.
Vijesh
37

Sie müssen nur die einfachen Anführungszeichen verdoppeln ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')
Justin Niessner
quelle
21

Sie müssen dem Apostroph entkommen. In T-SQL ist dies mit einem doppelten Apostroph, sodass Ihre insertAussage wie folgt lautet :

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'
David Hall
quelle
AFAIK das Valuesmuss in geschweiften Klammern stehen (was dann die gleiche Antwort wie die von @JustinNiessner macht)
qwerty_so
15

Weil ein einfaches Anführungszeichen verwendet wird, um den Anfang und das Ende einer Zeichenfolge anzugeben; du musst ihm entkommen.

Die kurze Antwort besteht darin, zwei einfache Anführungszeichen zu verwenden '', damit eine SQL-Datenbank den Wert als speichert '.

Sehen Sie sich an, wie Sie mit REPLACE eingehende Werte bereinigen können:

Sie möchten nach ihnen suchen ''''und sie ersetzen, wenn sie in der Zeichenfolge vorhanden sind '''''', um dem einzelnen einfachen Anführungszeichen zu entgehen.

OMG Ponys
quelle
3

Eduffy hatte eine gute Idee . Er hat es gerade in seinem Codebeispiel rückwärts bekommen. Entweder in JavaScript oder in SQLite können Sie den Apostroph durch das Akzent-Symbol ersetzen.

Er (ich bin mir aus Versehen sicher) hat das Akzent-Symbol als Trennzeichen für die Zeichenfolge gesetzt, anstatt das Apostroph in O'Brian zu ersetzen. Dies ist in der Tat in den meisten Fällen eine äußerst einfache Lösung.

Robert Sherman
quelle
Tolle und viel einfachere Lösung und mein Nachname ist O`Reilly!
PhillipOReilly
Wie auch immer, es wird empfohlen, Escape-Zeichen zu verwenden. Aus Versehen :) seit dem Tag, an dem ich die Tastatur benutze. Ich verwende beim Schreiben von Dokumenten unbeabsichtigt anstelle eines einfachen Anführungszeichens ein Akzentsymbol. (Im Code verwende ich jedoch 'als Zeichenbezeichnung). Bis mir letztes Jahr jemand sein Passwort sagte und ich mich nicht bei seinem System anmelden konnte. Wir konnten erst nach Stunden herausfinden, dass ich "als" tippe.
Lerner
3

Das Apostrophzeichen kann durch Aufrufen der CHAR- Funktion mit dem ASCII-Tabellensuchwert 39 des Apostrophs eingefügt werden . Die Zeichenfolgenwerte können dann zusammen mit einem Verkettungsoperator verkettet werden .

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')
Nathan
quelle
2

Einfache Anführungszeichen werden durch Verdoppeln entzogen .

Das folgende SQL veranschaulicht diese Funktionalität.

declare @person TABLE (
    [First] nvarchar(200),
    [Last] nvarchar(200)
)

insert into @person 
    (First, Last)
values
    ('Joe', 'O''Brien')

select * from @person

Ergebnisse

First   | Last
===================
Joe     | O'Brien
Max Pringle
quelle
0

Verwenden Sie doppelte Anführungszeichen um die Werte.

insert into Person (First, Last) Values("Joe","O'Brien")
Laufzeit Fehler
quelle
3
Beachten Sie, dass dies kein Standard-SQL mehr ist, obwohl ich weiß, dass Informix, um nur ein DBMS zu nennen, dies zulässt. Sie sollten auch festlegen, wie Sie eine Zeichenfolge einfügen möchten, z. B. He said, "Don't!"einfache Anführungszeichen und / oder doppelte Anführungszeichen. Dies ist möglich: 'He said, "Don''t!"'oder "He said, ""Don't!""". Wenn Sie einer seit langem bestehenden Frage mit akzeptierten Antworten eine neue Antwort hinzufügen, müssen Sie neue, vollständige Informationen bereitstellen. Die Verwendung von doppelten Anführungszeichen ist neu - jedoch auf einige wenige DBMS beschränkt. Sie sollten sich Mühe geben, mindestens einen von denen zu identifizieren, die sie akzeptieren.
Jonathan Leffler
-1

Verwenden Sie stattdessen einen Backtick (auf der ~ -Taste).

`O'Brien`
nervös
quelle
1
Dann wird das Problem: Wie füge ich einen Backtick ein?
Jasper de Vries
1
Dies ist zwar nicht die "richtige" Antwort, aber ich arbeite mit einer Reihe von Namen, die dies nicht haben, und ich führe einmalige Operationen durch, sodass mein Problem sofort gelöst wurde. Vielen Dank!
nscalf