Я столкнулся с действительно странной проблемой хранения значений в MySQL. Предпосылка:
У меня есть таблица, которая использует DECIMAL(15,8)
для хранения денежных значений (например, всего порядка), но когда я пытаюсь вставить, например:
2,45545345
это сохраняется как
2.00000000
Я пробовал MySQL функции FORMAT / CAST, но все тот же результат.
Вот как генерируется запрос:
$db->query("INSERT INTO `random_table_name` SET currency_value = '" . floatval($value) . "'");
Я также попробовал doubleval
, но тот же результат. Самое смешное в том, что эта же часть кода работала нормально пару недель назад, и я не могу вспомнить никаких изменений в структуре db или классе db, которые могут вызвать это.
Используйте num_format для замены .
Как это:
number_format($value, 8, '.') // 8 = number of decimals, . = decimal separator
Однако ваша проблема, похоже, связана с текущей локалью. Вам нужно изучить следующее: setlocale () и localeconv
setlocale(LC_ALL, 'en_US'); // NOT TESTED, read up on the appropriate syntax
Это подходящий способ сделать это, альтернативой было бы (как предложено ниже) сделать str_replace(',', '.')
, Но вы должны делать обратный каждый раз, когда хотите вывести строки.
Однако есть еще один вариант, вы можете установить локаль MySQL в en_US
.
Замените ,
с .
перед вставкой в db:
$value = str_replace( ',', '.', $value);
Это создаст допустимое число, которое можно безопасно вставить в базу данных. Или просто добавьте его прямо в свой запрос:
INSERT INTO `random_table_name` SET currency_value = '" . str_replace( ',', '.', $value ) . "'