sql >> Database teknologi >  >> RDS >> Mysql

Hvornår skal man bruge enkelte anførselstegn, dobbelte anførselstegn og backticks i MySQL

Backticks skal bruges til tabel- og kolonneidentifikatorer, men er kun nødvendige, når identifikatoren er en MySQL reserveret søgeord , eller når identifikatoren indeholder blanktegn eller tegn ud over et begrænset sæt (se nedenfor) Det anbefales ofte at undgå at bruge reserverede søgeord som kolonne- eller tabel-id, når det er muligt, for at undgå citeringsproblemet.

Enkelte anførselstegn skal bruges til strengværdier som i VALUES() liste. Dobbelte anførselstegn understøttes også af MySQL for strengværdier, men enkelte anførselstegn er mere almindeligt accepteret af andre RDBMS, så det er en god vane at bruge enkelte anførselstegn i stedet for dobbelte.

MySQL forventer også DATE og DATETIME bogstavelige værdier skal anføres som strenge som '2001-01-01 00:00:00' . Se dato og klokkeslæt dokumentation for flere detaljer, især alternativer til at bruge bindestregen - som segmentafgrænsning i datostrenge.

Så ved at bruge dit eksempel, ville jeg dobbeltcitere PHP-strengen og bruge enkelte anførselstegn på værdierne 'val1', 'val2' . NULL er et MySQL-søgeord og en speciel (ikke)-værdi og er derfor ikke citeret.

Ingen af ​​disse tabel- eller kolonneidentifikatorer er reserverede ord eller gør brug af tegn, der kræver citering, men jeg har alligevel citeret dem med backticks (mere om dette senere...).

Funktioner native til RDBMS (f.eks. NOW() i MySQL) bør ikke citeres, selvom deres argumenter er underlagt den samme streng eller identifikator citeringsregler, der allerede er nævnt.

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         ─────────────────────────────────────────┴┴┴┴┘    

Variabel interpolation

Citeringsmønstrene for variabler ændres ikke, men hvis du har til hensigt at interpolere variablerne direkte i en streng, skal de anføres i PHP. Bare sørg for, at du har undgået variablerne korrekt til brug i SQL. (Det anbefales at bruge en API, der understøtter forberedte udsagn i stedet som beskyttelse mod SQL-injektion ).

// 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')";

Forberedte erklæringer

Når du arbejder med udarbejdede udsagn, skal du konsultere dokumentationen for at afgøre, om udsagnets pladsholdere skal citeres eller ej. De mest populære API'er, der er tilgængelige i PHP, PDO og MySQLi, forventer uciteret pladsholdere, ligesom de fleste forberedte erklærings-API'er på andre sprog:

// 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 (?, ?, ?, ?)";

Tegn, der kræver backtick-citering i identifikatorer:

Ifølge MySQL-dokumentationen , behøver du ikke at citere (backtick) identifikatorer ved hjælp af følgende tegnsæt:

ASCII:[0-9,a-z,A-Z$_] (grundlæggende latinske bogstaver, cifre 0-9, dollar, understregning)

Du kan bruge tegn ud over det sæt som tabel- eller kolonneidentifikatorer, inklusive mellemrum for eksempel, men så skal citere (tilbagemærke) dem.

Selvom tal er gyldige tegn for identifikatorer, kan identifikatorer ikke udelukkende bestå af tal. Hvis de gør det, skal de pakkes ind i backticks.



  1. Vis SQLite-data i RecyclerView

  2. Noter om PostgreSQL B-Tree-indekser

  3. Sådan overvåger du MySQL-containere med Prometheus - Implementering på Standalone og Swarm::Første del

  4. Funktionsbaserede indekser i SQL Server