sql >> Databáze >  >> RDS >> Mysql

Kdy použít jednoduché uvozovky, dvojité uvozovky a zadní zaškrtnutí v MySQL

Pro identifikátory tabulek a sloupců se mají použít zpětné zaškrtnutí, ale jsou nutné pouze v případě, že identifikátor je Vyhrazené klíčové slovo MySQL , nebo když identifikátor obsahuje prázdné znaky nebo znaky přesahující omezenou množinu (viz níže). Často se doporučuje nepoužívat vyhrazená klíčová slova jako identifikátory sloupců nebo tabulek, je-li to možné, aby se předešlo problému s citacemi.

U řetězcových hodnot jako v VALUES() by se měly používat jednoduché uvozovky seznam. Dvojité uvozovky jsou podporovány MySQL i pro hodnoty řetězců, ale jiné RDBMS přijímají jednoduché uvozovky, takže je dobrým zvykem používat jednoduché uvozovky místo dvojitých.

MySQL také očekává DATE a DATETIME doslovné hodnoty, které mají být uváděny v jednoduchých uvozovkách jako řetězce jako '2001-01-01 00:00:00' . Prostudujte si literály data a času dokumentaci pro více podrobností, zejména alternativy k použití pomlčky - jako oddělovač segmentu v řetězcích data.

Takže pomocí vašeho příkladu bych řetězec PHP uvedl do dvojitých uvozovek a použil jednoduché uvozovky pro hodnoty 'val1', 'val2' . NULL je klíčové slovo MySQL a speciální (ne)hodnota, a proto není v uvozovkách.

Žádný z těchto identifikátorů tabulek nebo sloupců není vyhrazená slova ani nevyužívá znaky vyžadující uvozovky, ale i tak jsem je citoval se zpětným zaškrtnutím (více o tom později...).

Funkce nativní pro RDBMS (například NOW() v MySQL) by neměly být citovány, ačkoli jejich argumenty podléhají stejným již zmíněným pravidlům pro citování řetězců nebo identifikátorů.

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

Proměnná interpolace

Vzory uvozovek pro proměnné se nemění, i když pokud máte v úmyslu interpolovat proměnné přímo do řetězce, musí být v PHP uvozován dvakrát. Jen se ujistěte, že jste správně escapovali proměnné pro použití v SQL. (Doporučuje se používat API podporující připravená prohlášení místo toho jako ochranu proti SQL injection ).

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

Připravená prohlášení

Při práci s připravenými příkazy nahlédněte do dokumentace, abyste zjistili, zda musí být zástupné symboly příkazu citovány. Nejoblíbenější API dostupná v PHP, PDO a MySQLi očekávejte neuvozovaná zástupné symboly, stejně jako většina připravených příkazových rozhraní API v jiných jazycích:

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

Znaky vyžadující zpětné zaškrtnutí v identifikátorech:

Podle dokumentace MySQL , nemusíte uvádět (obrácené) identifikátory pomocí následující znakové sady:

ASCII:[0-9,a-z,A-Z$_] (základní latinská písmena, číslice 0-9, dolar, podtržítko)

Znaky nad rámec této sady můžete použít jako identifikátory tabulky nebo sloupce, včetně například mezer, ale pak musíte citovat (zaškrtnout).

I když jsou čísla platnými znaky pro identifikátory, identifikátory se nemohou skládat pouze z čísel. Pokud tak učiní, musí být zabaleny do zadních značek.



  1. 2 způsoby, jak vrátit název serveru v SQL Server (T-SQL)

  2. Generování řady čísel v MySQL

  3. Používejte relační databáze MySQL na Ubuntu 10.10 (Maverick)

  4. Nelze nainstalovat pg gem na Windows