Как хранить европейскую валюту в MySQL?

В новом проекте, над которым я работаю, у меня есть данные в формате CSV для импорта в таблицу mysql. Одним из столбцов является поле цены, которое хранит валюту в европейском формате, т.е. 345,83. У меня есть сохранение этого десятичного разделителя. В большинстве европейских валют децимальный разделитель «,», но когда я пытаюсь вставить десятичное число в поле (например, 345,83), я получаю следующую ошибку: «Данные усечены для столбца« column_name »в строке« row # «». Если я использую '.' вместо «,» работает отлично. Не могли бы вы помочь мне, как сохранить этот формат в mysql?

вы можете сохранить его как обычное десятичное поле в базе данных и форматировать номер европейского стиля при его отображении

edit: просто добавил пример того, как это может быть достигнуто

$european_numbers = array('123.345,78', '123 456,78', ',78'); foreach($european_numbers as $number) { echo "$number was converted to ".convert_european_to_decimal($number)."\n"; // save in database now } function convert_european_to_decimal($number) { // i am sure there are better was of doing this, but this is nice and simple example $number = str_replace('.', '', $number); // remove fullstop $number = str_replace(' ', '', $number); // remove spaces $number = str_replace(',', '.', $number); // change comma to fullstop return $number; } 

Используйте number_format или money_format , это в значительной степени то, что вы предпочитаете.

Это хуже, чем вы думаете. Число 1234.56 может быть написано в Европе как:

  1. 1234,56
  2. 1 234,56 (пробел как разделитель групп)
  3. 1,234,56 (точка в качестве разделителя групп)

В .net парсер чисел может работать в соответствии с определенной культурой, поэтому, если вы знаете формат, который он выполняет для вас. Я уверен, что вы можете найти эквивалент PHP, это сэкономит вам массу неприятностей.

Вы можете импортировать поле валюты в столбец VARCHAR а затем скопировать этот столбец в столбец DECIMAL при замене на . во всех строках с использованием MySQL-манипуляций-функций.

 UPDATE <<table>> SET <<decimal-currency-col>> = REPLACE(<<varchar-currency-col>>, ',', '.'); 

Некоторые типы данных не имеют прямой корреляции между SQL Server или Access и MySQL. Одним из примеров может быть тип данных CURRENCY: MySQL не имеет (пока) тип данных CURRENCY, но создание той же цели служит столбец с определением DECIMAL (19,4). В то время как MSSQL по умолчанию использует типы символов Unicode, такие как nCHAR и nVARCHAR, MySQL не так тесно связывает наборы символов с типами полей, а позволяет использовать один набор типов символов, которые могут быть привязаны к любому набору символов, включая Unicode.

от http://dev.mysql.com/tech-resources/articles/migrating-from-microsoft.html

Вы также можете рассмотреть возможность умножения на 100 и сохранение его как INT.

Прежде чем вставлять цену в БД:

 $price = (int)$price*100; 

После получения цены от БД:

 $price = number_format($price, 2, ',', ' '); 
 Try replacing the "," with "."? $price = str_replace(",", ".", $price);