Kropka i przecinek czyli liczby w PHP i MySQL

Być może napotkaliście kiedyś problem z reprezentacją liczb naturalnych w PHP i MySQL. Otóż MySQL jako punkt dziesiętny stosuje zawsze kropkę, w PHP zależy to natomiast od ustawionej lokalizacji.

Tym samym, jeżeli w PHP ustawimy lokalizację, w której punkt dziesiętny nie jest kropką (na przykład polską), wstawiając takie liczby do zapytania SQL otrzymamy błąd SQL:

setlocale(LC_ALL ~LC_NUMERIC,'pl_PL'); //lub setlocale(LC_ALL,'plk_PLK') na systemach Windows
$result=5/2;
mysql_query('UPDATE table SET value='.$result);

You have an error IN your SQL syntax; CHECK the manual that corresponds TO your MySQL server version FOR the RIGHT syntax TO USE near ‘5’ at line 1

Rozwiązanie problemu jest oczywiście bardzo proste. Możemy wybrać, wśród dostępnych kategorii, jakich funkcji ma dotyczyć ustawienie lokalizacji.

setlocale(LC_TIME,'pl_PL'); //lub setlocale(LC_TIME,'plk_PLK') na systemach Windows
$result=5/2;
mysql_query('UPDATE table SET value='.$result); //teraz będzie ok

Oto lista wszystkich dostępnych opcji dla setlocale. Dla każdej z nich można ustawić inną lokalizację:

  • LC_ALL for all of the below
  • LC_COLLATE for string comparison, see strcoll()
  • LC_CTYPE for character classification and conversion, for example strtoupper()
  • LC_MONETARY for localeconv()
  • LC_NUMERIC for decimal separator (See also localeconv())
  • LC_TIME for date and time formatting with strftime()
  • LC_MESSAGES for system responses (available if PHP was compiled with libintl)