W najnowszym wydanie serwera MySQL, autorzy wprowadzili jako domyślne ustawienia prawidłowego budowania zapytań SQL.

Co to oznacza dla Ciebie i Twojej aplikacji? Starsze wersje MySQL ignorowały błędy w kodach aplikacji, po prostu pozwalały programistom na pisanie niechlujnego kodu czy niezgodnego z zasadami języka SQL.

Doprowadzało do absurdalnych sytuacji, w których pojawiały się błędne dane w rekordach (na skutek źle przekazanych danych przez programistów sklepów, CMSów itp.) Od wersji MySQL 5.7.5 autorzy serwera baz danych wprowadzili bardziej restrykcyjnej podejście do zapytań SQL, wszystkie błędy w składni lub np. metody dzielenia przez zero są wychwytywane ich wykonanie jest odrzucane.

Gdzie leży błąd

Spotkaliśmy się z informacją, że wina działania serwera MySQL (kiedyś działało, teraz nie działa) leży w konfiguracji serwera. Nie. Błąd od zawsze był w kodzie państwa aplikacji, pomimo tego iż autorzy serwera MySQL wyraźnie informowali o zasadach budowy zapytań SQL, co wielu programistów wolało robić na własną modłę. Być może z lenistwa, przekory lub zwyczajnie z braku wiedzy, jednak przerzucając ew. błędy na państwa. Prosimy nie dać sobie tego wmówić - błąd jest po stronie oprogramowania sklepu/CMS. Dodatkowo programiści tak felernego oprogramowania mają możliwość sterowania zachowaniem serwera MySQL i zatuszować swoje błędy. Jak łatwo się domyślić także o tym nie wiedzą.

Prośba autorów aplikacji o wyłączenie modu strict, to jak proszenie pasażera samochodu aby nie opierał się o drzwi pod wypadną :)

Jeżeli Twoje oprogramowanie jest na gwarancji szybko skontaktuj się z producentem oprogramowania i poproś o usunięcie błędów w kodzie jego aplikacji.

Tymczasowe rozwiązanie

Nie mniej, pozostała tymczasowa furtka dla właścicieli tak napisanego oprogramowania, wystarczy na początku połączenia z bazą danych (odnaleźć w plikach kod odpowiedzialny za łączenie z bazą danych i zaraz poniżej wykonać zapytanie SQL o treści:

SET sql_mode='';

Adekwatnie można włączyć metodę strict poprzez np. wywołanie jedenej z komend:

SET sql_mode='STRICT_ALL_TABLES';

lub włączenie trybu strict, dla zapytań transakcyjnych

SET sql_mode='STRICT_TRANS_TABLES';

Za jej pomocą można dowolnie sterować konfiguracją serwera MySQL - nie jest to nowa funkcja i istnieje od lat, która umożliwia (narazie) włączenie lub wyłączenie takiego trybu pracy dla serwera MySQL na czas danego połączenia.

Dlaczego rozwiązanie jest tymczasowe? Ponieważ autorzy serwera bazy danych:

  • określają takie ustawienia jako zalecana
  • domyślnie włączają taką opcję przy nowych instalacjach i aktualizacjach

Jest sygnałem dla autorów, iż w przyszłych wersjach będzie już to standardem i nie da się być może obejść błędów w aplikacji w inny sposób niż uruchamianie dedykowanej instancji pod bazę danych - co zawsze jest najdroższym rozwiązaniem.

W chwili obecnej wyłączyliśmy czasowo na serwerach stosowanie metody STRICT - prosimy wszystkich państwa o dostosowanie swoich aplikacji do końca 30.03.2018 i usunięcie z nich błędów.

Dla osób które nie chcą lub nie mogą tego wykonać pozostanie możliwość uruchomienia oprogramowania na Hostingu Dedykowanym gdzie ustawienia serwera można dopasować nawet do najbardziej niechlujnie napisanej aplikacji.

Dokumentacja: