Korzystanie z odwrotnych apostrofów wokół nazw pól


172

Po przeczytaniu kilku odpowiedzi i komentarzy do niektórych pytań SQL tutaj, a także usłyszeniu, że mój przyjaciel pracuje w miejscu, w którym obowiązuje polityka, która go zakazuje, zastanawiam się, czy jest coś złego w używaniu odwrotnych apostrofów wokół nazw pól w MySQL .

To jest:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...

24
backticks są bardzo przydatne, jeśli chcesz mieć nazwy kolumn, takich jak count, type, tablelub podobny
Knittla


@knittl myślę, że pytanie jest, powinny mieć nazwy kolumn, jak count, typei table. Są to okropnie niejednoznaczne terminy i prawie w każdym przypadku te nazwy można by poprawić, aby były bardziej szczegółowe. Nazywanie kolumn takich rzeczy jest również niebezpieczne i potencjalne źródło błędów, ponieważ nigdy nie wiadomo, kiedy ktoś może zapomnieć o dodaniu znaków odwrotnych lub nie zdaje sobie sprawy, że musi. Myślę, że lepszą praktyką jest unikanie używania zastrzeżonych terminów jako nazw kolumn.
dallin

Używam ich zawsze, więc nie narażam się na niebezpieczeństwo, używając w żadnym momencie zarezerwowanych słów kluczowych.
Markus Zeller

Odpowiedzi:


153

Korzystanie z lewych apostrofów pozwala na używanie alternatywnych znaków. Przy pisaniu zapytań nie jest to taki problem, ale jeśli przyjmie się, że można po prostu używać odwrotnych apostrofów, zakładam, że pozwala to uciec z absurdalnymi rzeczami, takimi jak

SELECT `id`, `my name`, `another field` , `field,with,comma` 

Co oczywiście generuje źle nazwane tabele.

Jeśli jesteś tylko zwięzły, nie widzę z tym problemu, zauważysz, że uruchomisz zapytanie jako takie

EXPLAIN EXTENDED Select foo,bar,baz 

Wygenerowane ostrzeżenie, które powróci, będzie zawierało znaczniki wsteczne i w pełni kwalifikowane nazwy tabel. Więc jeśli korzystasz z funkcji generowania zapytań i automatycznego ponownego pisania zapytań, lewe apostrofy sprawią, że wszystko, co analizuje kod, będzie mniej zagmatwane.

Myślę jednak, że zamiast narzucać możliwość używania znaków odwrotnych, powinny one mieć standard nazw. Rozwiązuje bardziej „rzeczywiste” problemy.


Czy musimy ich używać również w PostgreSQL?
Yousuf Memon

5
Nie ma potrzeby, tylko zalecenie. Warto je przedstawiać w cudzysłowie, aby uniknąć niejednoznaczności ze słowami kluczowymi SQL, jeśli w przyszłości zostanie dodane słowo kluczowe SQL, które będzie miało wspólną nazwę pola. Cytowanie dotyczy tylko sytuacji, w których pole ma wspólną nazwę słowa kluczowego, na przykład select count from foovs select "count" from fooda zupełnie inne wyniki. Ale postgres różni się od mysql na dwa sposoby: 1. Pola są cytowane przez "". 2. W polach bez cudzysłowów wielkość liter nie jest rozróżniana postgresql.org/docs/current/static/ ...
Kent Fredric

57

Jedynym problemem związanym z odwrotnymi znakami jest to, że nie są one zgodne z ANSI-SQL, np. Nie działają w SQL Server.

Jeśli istnieje szansa, że ​​będziesz musiał przenieść swój kod SQL do innej bazy danych, użyj podwójnych cudzysłowów.


15
Tak. Użyj trybu ANSI MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - aby włączyć podwójne cudzysłowy w MySQL i tym samym odzyskać zgodność między bazami danych. Lewe cudzysłowy / cudzysłowy są również konieczne, ponieważ nigdy nie wiesz, co stanie się zarezerwowanym słowem w przyszłych wersjach DBMS.
bobince

1
To prawda! Jedna z naszych aplikacji serwerowych działała prawidłowo, dopóki nie zastosowaliśmy aktualizacji naszego silnika bazy danych, która dodała nowe słowo kluczowe. Nagle wszystko, co pytało o konkretny stół, pękało.
Miquella

@bobince Kiedy byłem nowy w programowaniu , nazwałem kolumnę rangelub coś w tym rodzaju. Kiedy zaktualizowaliśmy MySQL 5, nie udało się, ponieważ było to nowe słowo zastrzeżone!
Alex

1
Nie używaj cudzysłowów. Nie zawsze będzie działać. Na przykład ... DELETE FROM app_key_storesWHERE ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Zapytanie OK, dotyczy 0 wierszy (0,00 s) DELETE FROM app_key_storesWHERE ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Zapytanie OK, dotyczy 5 wierszy (0,00 s)
Altonymous

44

Uważam, że używanie ich przez cały czas, gdy mamy do czynienia z nazwami pól, ma sens.

  • Po pierwsze, kiedy już wpadniesz w nałóg, nie zaszkodzi samo naciśnięcie klawisza backtick.
  • Po drugie, dla mnie łatwiej jest zobaczyć, jakie dokładnie są pola w zapytaniu i jakie są słowa kluczowe lub metody.
  • Wreszcie, pozwala na użycie dowolnej nazwy pola podczas projektowania tabeli. Czasami sensowne jest nazwanie pola „kluczem”, „porządkiem” lub „wartościami” ... z których wszystkie wymagają znaków odwrotnych podczas odwoływania się do nich.

19
Należy również dodać, że chroni Cię to przed użyciem w przyszłości słów zastrzeżonych (które wcześniej mnie ugryzły).
Alex

5
Właściwie to kiedyś ktoś wyedytował dodatkowe znaki wsteczne z jednego z moich pytań, co mnie zdenerwowało, ponieważ właśnie z tego powodu otaczam każdą zmienną nimi
Brian Leishman

2
Pozwala również na bezpieczne używanie nieanglojęzycznych etykiet, które same w sobie są wystarczające, aby zachęcić do używania grawerunków.
Aternus

26

Backticks nie są częścią standardowego ANSI SQL. Z podręcznika mysql :

Jeśli tryb ANSI_QUOTES SQL jest włączony, dozwolone jest również cytowanie identyfikatorów w cudzysłowach

Więc jeśli użyjesz odwrotnych znaków, a następnie zdecydujesz się odejść od MySQL, masz problem (chociaż prawdopodobnie masz też dużo większe problemy)


9

Nie ma nic złego, jeśli nadal używasz MYSQL, z wyjątkiem może wizualnej niejasności zapytań. Ale pozwalają na użycie zastrzeżonych słów kluczowych lub osadzonych spacji jako nazw tabel i kolumn. W przypadku większości silników baz danych jest to nie-nie, które uniemożliwi późniejszą migrację.

Jeśli chodzi o łatwość czytania, wiele osób używa wielkich liter w słowach kluczowych SQL, np.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

Jeśli o mnie chodzi, zawsze należy używać grawitacji. Ale jest kilka powodów, dla których zespół może chcieć ich nie używać.

Zalety:

  • Używając ich, nie ma zastrzeżonych słów ani zabronionych znaków.
  • W niektórych przypadkach otrzymujesz bardziej opisowe komunikaty o błędach.
  • Jeśli unikasz złych praktyk, nie przejmujesz się, ale ... tak naprawdę, czasami są one dobrym sposobem na uniknięcie wstrzyknięć SQL.

Niedogodności:

  • Nie są standardowe i zwykle nie są przenośne. Jednakże, o ile nie używasz znaku wstecznego jako części identyfikatora (co jest najgorszą praktyką, jaką mogę sobie wyobrazić), możesz przenieść zapytanie, automatycznie usuwając lewe apostrofy.
  • Jeśli niektóre zapytania pochodzą z programu Access, mogą cytować nazwy tabel za pomocą „(i być może nie możesz usunąć wszystkich„ na ślepo ”). Dozwolone są jednak mieszanki apostrofów i cudzysłowów.
  • Niektóre głupie programy lub funkcje filtrują zapytania i mają problemy z grawitacjami. Są one jednak częścią ASCII, więc oznacza to, że oprogramowanie / funkcja jest bardzo złe.

9
Używanie znaków odwrotnych nie ma absolutnie nic wspólnego z unikaniem wstrzyknięć SQL.
Andy Lester

6
@andy może to pomóc, ponieważ atakujący musi go zamknąć kolejnym kliknięciem wstecz , aby wstrzyknąć. Robi niewiele, ale to wciąż coś
jasonszhao

4

O wiele łatwiej jest przeszukać bazę kodu w celu znalezienia czegoś w odwrotnych znakach. Powiedzmy, że masz tabelę o nazwie event. grep -r "event" *może zwrócić setki wyników. grep -r "\`event\`" *zwróci wszystko, co prawdopodobnie odnosi się do Twojej bazy danych.


Ogólnie nie jest to korzyść. Tabele, na które natkniesz się zawodowo, nazywane są bardziej jak new_users_info niż „general”.
ankush981

3

Cóż, o ile wiem, głównym celem używania grawisów jest to, że możesz używać nazw, które pokrywają się z zastrzeżonymi słowami kluczowymi. Tak więc, jeśli nazwa nie koliduje z zastrzeżonym słowem kluczowym, nie widzę powodu, aby używać odwrotnych apostrofów. Ale to też nie powód, by ich zakazać.


2

Prosta rzecz dotycząca znaku wstecznego `` jest używana do oznaczenia identyfikatora, takiego jak nazwa_bazy_danych, nazwa_tabeli itp., I pojedynczego cudzysłowu '' , podwójnego cudzysłowu "" dla literałów łańcuchowych, natomiast "" użyj do wypisania wartości bez zmian i '' wydrukuj zmienną wartości trzymaj lub w innym przypadku wydrukuj jego tekst.

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..

0

jeśli używasz niektórych nazw pól jako domyślnych wartości mysql lub mssql, na przykład „status”, musisz użyć odwrotnych apostrofów („wybierz statusz nazwa_tabeli” lub „wybierz id z nazwa_tabeli, gdzie status= 1”). ponieważ mysql zwraca błędy lub nie działa na zapytanie.


0

Głównym zastosowaniem backticks (`) w SQL jest użycie ich w sytuacjach, w których zamierzasz wywołać je ponownie w nadchodzących klauzulach. W każdym innym przypadku zaleca się używanie cudzysłowów („”).

Na przykład

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

W powyższym stwierdzeniu widzisz, jak Publisher and Locationjest używany ponownie w GROUP BYklauzuli.

Zamiast używać

GROUP BY Nazwa, miasto, kod stanu

Właśnie użyłem

GRUPUJ WEDŁUG Publisher and Location

Dopiero w takich sytuacjach warto używać lewych cudzysłowów. We wszystkich innych przypadkach zalecane jest używanie podwójnych cudzysłowów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.