Как хранить европейскую валюту в MySQL? - PullRequest
0 голосов
/ 13 июля 2009

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

Ответы [ 7 ]

13 голосов
/ 13 июля 2009

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

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;
}
4 голосов
/ 13 июля 2009

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

3 голосов
/ 13 июля 2009

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

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

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

1 голос
/ 13 июля 2009

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

UPDATE <<table>>
    SET <<decimal-currency-col>> = REPLACE(<<varchar-currency-col>>, ',', '.');
0 голосов
/ 13 июля 2009

Вы также можете подумать об умножении на 100 и сохранении его как INT.

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

$price = (int)$price*100;

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

$price = number_format($price, 2, ',', ' ');
0 голосов
/ 13 июля 2009

Некоторые типы данных не имеют прямого корреляция между SQL Server или Доступ и MySQL. Одним из примеров будет тип данных CURRENCY: MySQL не (пока) имеют тип данных ВАЛЮТА, но создание столбца с определением ДЕЦИМАЛЬ (19,4) служит той же цели. Хотя MSSQL по умолчанию использует Юникод типы символов, такие как nCHAR и nVARCHAR, MySQL не так тесно привязывать наборы символов к типам полей, вместо того, чтобы учесть один набор типы символов, которые могут быть связаны с любое количество наборов символов, включая Юникод.

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

0 голосов
/ 13 июля 2009
Try replacing the "," with "."?

$price = str_replace(",", ".", $price);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...