sql >> Database >  >> RDS >> Mysql

Wanneer enkele aanhalingstekens, dubbele aanhalingstekens en backticks gebruiken in MySQL?

Backticks moeten worden gebruikt voor tabel- en kolom-ID's, maar zijn alleen nodig als de ID een MySQL gereserveerd zoekwoord , of wanneer de identifier witruimtetekens of tekens bevat die groter zijn dan een beperkte set (zie hieronder). Het wordt vaak aanbevolen om, indien mogelijk, het gebruik van gereserveerde trefwoorden als kolom- of tabel-ID's te vermijden, om het probleem met aanhalingstekens te vermijden.

Enkele aanhalingstekens moeten worden gebruikt voor tekenreekswaarden zoals in de VALUES() lijst. Dubbele aanhalingstekens worden ook ondersteund door MySQL voor tekenreekswaarden, maar enkele aanhalingstekens worden meer geaccepteerd door andere RDBMS, dus het is een goede gewoonte om enkele aanhalingstekens te gebruiken in plaats van dubbele.

MySQL verwacht ook DATE en DATETIME letterlijke waarden die tussen enkele aanhalingstekens moeten worden geplaatst als tekenreeksen zoals '2001-01-01 00:00:00' . Raadpleeg de datum- en tijdliteratuur documentatie voor meer details, in het bijzonder alternatieven voor het gebruik van het koppelteken - als scheidingsteken voor segmenten in datumreeksen.

Dus als ik jouw voorbeeld zou gebruiken, zou ik de PHP-string dubbel citeren en enkele aanhalingstekens gebruiken voor de waarden 'val1', 'val2' . NULL is een MySQL-sleutelwoord, en een speciale (niet)-waarde, en staat daarom niet tussen aanhalingstekens.

Geen van deze tabel- of kolom-ID's zijn gereserveerde woorden of maken gebruik van tekens die aanhalingstekens vereisen, maar ik heb ze toch geciteerd met backticks (hierover later meer...).

Functies eigen aan het RDBMS (bijvoorbeeld NOW() in MySQL) mogen niet worden aangehaald, hoewel hun argumenten onderworpen zijn aan dezelfde regels voor het aanhalen van tekenreeksen of identifiers die al zijn genoemd.

Backtick (`)
table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐
                      ↓     ↓  ↓  ↓  ↓    ↓  ↓    ↓  ↓    ↓  ↓       ↓
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) 
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";
                               ↑↑↑↑  ↑    ↑  ↑    ↑  ↑          ↑  ↑↑↑↑↑ 
Unquoted keyword          ─────┴┴┴┘  │    │  │    │  │          │  │││││
Single-quoted (') strings ───────────┴────┴──┴────┘  │          │  │││││
Single-quoted (') DATE    ───────────────────────────┴──────────┘  │││││
Unquoted function         ─────────────────────────────────────────┴┴┴┴┘    

Variabele interpolatie

De aanhalingstekens voor variabelen veranderen niet, hoewel als u van plan bent om de variabelen rechtstreeks in een string te interpoleren, deze dubbele aanhalingstekens moet zijn in PHP. Zorg ervoor dat u de variabelen correct hebt ge-escaped voor gebruik in SQL. (Het wordt aanbevolen om een ​​API te gebruiken die voorbereide verklaringen ondersteunt in plaats daarvan, als bescherming tegen SQL-injectie ).

// Same thing with some variable replacements
// Here, a variable table name $table is backtick-quoted, and variables
// in the VALUES list are single-quoted 
$query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";

Voorbereide verklaringen

Raadpleeg bij het werken met voorbereide verklaringen de documentatie om te bepalen of de tijdelijke aanduidingen van de verklaring al dan niet moeten worden geciteerd. De meest populaire API's beschikbaar in PHP, PDO en MySQLi, verwacht niet geciteerd tijdelijke aanduidingen, net als de meeste voorbereide instructie-API's in andere talen:

// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";

// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

Tekens waarvoor backtick-citaten in identifiers vereist zijn:

Volgens MySQL-documentatie , u hoeft geen aanhalingstekens (backtick) te maken met de volgende tekenset:

ASCII:[0-9,a-z,A-Z$_] (basis Latijnse letters, cijfers 0-9, dollar, onderstrepingsteken)

U kunt tekens buiten die set gebruiken als tabel- of kolom-ID's, inclusief witruimte bijvoorbeeld, maar dan moet u moet citeer ze (backtick).

Ook al zijn getallen geldige tekens voor identifiers, identifiers kunnen niet alleen uit cijfers bestaan. Als ze dat doen, moeten ze in backticks worden gewikkeld.



  1. Geaggregeerde String Concatenatie in Oracle 10g

  2. Case in Select-verklaring

  3. Hoe gebruik je afbeeldingen in Android SQLite die groter zijn dan de beperkingen van een CursorWindow?

  4. Opgeslagen MySQL-procedures maken en gebruiken - een zelfstudie