Дроби, локали и MySQL

December 15, 2014

Однажды поймал интересный глюк. Очень долго искал причины и совершенно случайно нашел. Будьте бдительны при работе с разными локалями!

Устанавливаем русскую локаль

setlocale(LC_ALL, ‘ru_RU.CP1251’, ‘rus_RUS.CP1251’, ‘Russian_Russia.1251’);

Теперь PHP превращает наше дробное число 102.3 в 102,3. Обратите внимание на запятую.

setlocale(LC_ALL, ‘ru_RU.CP1251’, ‘rus_RUS.CP1251’, ‘Russian_Russia.1251’);
$float = 102.3;
echo $float; //102,3

и это совсем не нравится мускулу

MySQL Query Error: UPDATE b_catalog_price SET `CURRENCY` = ‘RUB’, `PRICE` = 102,3, `CATALOG_GROUP_ID` = 1, `PRODUCT_ID` = 36325 WHERE ID = 14463

неправильно настроенный север - та еще беда. решаем сие бедствие частичным сбросом локалей:

setlocale(LC_NUMERIC, ”);

теперь проверяем:

setlocale(LC_ALL, ‘ru_RU.CP1251’, ‘rus_RUS.CP1251’, ‘Russian_Russia.1251’);
setlocale(LC_NUMERIC, ”);
$float = 102.3;
echo $float; //102.3

 

Комментарии

comments powered by Disqus