2009-07-13 2 views
0

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

+0

Просто пояснить - это не проблема mysql, а вопрос о разборе европейских номеров? Если бы у вас был этот столбец как двойной, вы бы знали, что делать. – Kobi

ответ

13

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

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

$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; 
} 
+0

Поскольку я понял OP, это именно то, что он пытается сделать, но не удается из-за того, что MySQL использует точку в качестве десятичного разделителя. Вы не можете хранить значения с запятой в столбце DECIMAL. –

1

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

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

@S. Gehrig: Правильно, но немного перехитрить, учитывая, что OP использует PHP. –

+1

Это зависит: если OP имеет некоторые вычисления (например, некоторые накопления) на стороне MySQL, он должен хранить значения в соответствующем типе данных. –

-1
Try replacing the "," with "."? 

$price = str_replace(",", ".", $price); 
+1

Вы имеете в виду замену точкой, правильно? – Thilo

+0

@ Тило. Да, я думаю, что в этом случае она должна быть точкой, поскольку она представляется десятичным разделителем. В Великобритании мы используем запятую как разделитель тысяч и точку для десятичной точки, например. 1,250.25 Однако французские и другие европейские страны используют их в другом направлении, например. 1.250,00. – pjp

0

Some data types do not have a direct correlation between SQL Server or Access and MySQL. One example would be the CURRENCY data type: MySQL does not (yet) have a CURRENCY data type, but creating a column with the definition DECIMAL(19,4) serves the same purpose. While MSSQL defaults to Unicode character types such as nCHAR and nVARCHAR, MySQL does not so tightly bind character sets to field types, instead allowing for one set of character types which can be bound to any number of character sets, including Unicode.

из http://dev.mysql.com/tech-resources/articles/migrating-from-microsoft.html

4

Использование number_format или money_format, это довольно много, что вы preffer.

+0

помните, что money_format() не определено в системах Windows –

0

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

Перед установкой цены в БД:

$price = (int)$price*100; 

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

$price = number_format($price, 2, ',', ' '); 
3

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

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

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