Standardowy sposób ANSI wykonywania rozdzielanego identyfikatora to:
SELECT "field1" ...
a jeśli w nazwie jest ", podwój je:
SELECT "some""thing" ...
Niestety nie działa to w MySQL z ustawieniami domyślnymi, ponieważ MySQL woli myśleć, że podwójne cudzysłowy są alternatywą dla pojedynczych cudzysłowów dla literałów łańcuchowych. W takim przypadku musisz użyć backticków (jak opisuje Björn) i ukośnika odwrotnego.
Aby poprawnie wykonać ucieczki odwrotnym ukośnikiem, musisz potrzebujesz mysql_real_escape_string, ponieważ jest zależny od zestawu znaków. Ale kwestia jest dyskusyjna, ponieważ ani mysql_real_escape_string ani addslashes nie uciekają przed znakiem tylnego cudzysłowu . Jeśli możesz być pewien, że w nazwach kolumn nigdy nie będzie znaków spoza zestawu ASCII, możesz uniknąć ręcznej zmiany ukośnika odwrotnego na znaki ` i \.
Tak czy inaczej, nie jest to zgodne z innymi bazami danych. Możesz powiedzieć MySQL, aby zezwolił na składnię ANSI, ustawiając opcję konfiguracyjną ANSI_QUOTES. Podobnie SQL Server domyślnie dławi się podwójnymi cudzysłowami; używa jeszcze innej składni, a mianowicie nawiasów kwadratowych. Ponownie możesz skonfigurować go tak, aby obsługiwał składnię ANSI z opcją „quoted_identifier”.
Podsumowanie:jeśli potrzebujesz tylko kompatybilności z MySQL:
a. używaj odwrotnych cudzysłowów i nie zezwalaj na odwrotne cudzysłowy, odwrotny ukośnik i znak nul w nazwach, ponieważ ich unikanie jest niewiarygodne
Jeśli potrzebujesz kompatybilności z różnymi systemami DBMS, możesz:
b. używaj podwójnych cudzysłowów i wymagaj od użytkowników MySQL/SQL-Server odpowiedniej zmiany konfiguracji. Nie zezwalaj na znaki podwójnego cudzysłowu w nazwie (ponieważ Oracle nie może sobie z nimi poradzić). Lub
c. mieć ustawienie dla MySQL vs SQL Server vs inne i w zależności od tego utworzyć albo odwrotny cudzysłów, nawias kwadratowy lub składnię podwójnego cudzysłowu. Nie zezwalaj na podwójne cudzysłowy i odwrotny ukośnik/odwrotny cytat/nul.
Jest to coś, do czego można by mieć nadzieję, że warstwa dostępu do danych będzie miała funkcję, ale PDO nie.
Podsumowanie podsumowania:problemem są dowolne nazwy kolumn, których najlepiej unikać, jeśli możesz im pomóc.
Podsumowanie podsumowania podsumowania:gnnnnnnnnnnnh.