Php 如何在MySQL中存储欧洲货币?

Php 如何在MySQL中存储欧洲货币?,php,sql,mysql,Php,Sql,Mysql,在我处理的一个新项目中,我有CSV格式的数据要导入mysql表。其中一列是价格字段,用于存储欧洲格式的货币,即345,83。 我的问题是存储这个十进制分隔符。在大多数欧洲货币中,小数分隔符是“,”但当我尝试在字段中插入一个十进制数(例如345,83)时,我会得到以下错误:“在行“row”处截断列“column_name”的数据”。如果我使用“.”而不是“,”则效果很好。您可以帮助我,如何在mysql中存储此格式吗?您可以将货币字段导入VARCHAR列,然后将此列复制到DECIMAL列中,同时使用

在我处理的一个新项目中,我有CSV格式的数据要导入mysql表。其中一列是价格字段,用于存储欧洲格式的货币,即345,83。
我的问题是存储这个十进制分隔符。在大多数欧洲货币中,小数分隔符是“,”但当我尝试在字段中插入一个十进制数(例如345,83)时,我会得到以下错误:“在行“row”处截断列“column_name”的数据”。如果我使用“.”而不是“,”则效果很好。您可以帮助我,如何在mysql中存储此格式吗?

您可以将货币字段导入
VARCHAR
列,然后将此列复制到
DECIMAL
列中,同时使用mysql字符串操作函数将所有行中的
替换为

UPDATE <<table>>
    SET <<decimal-currency-col>> = REPLACE(<<varchar-currency-col>>, ',', '.');
更新
集合=替换(,,,,,);
某些数据类型没有直接的 SQL Server与SQL Server之间的关联 Access和MySQL。一个例子是 货币数据类型:MySQL不支持 (尚未)具有货币数据类型,但 使用定义创建列 十进制(19,4)也有同样的作用。 而MSSQL默认为Unicode 字符类型,如nCHAR和 nVARCHAR、MySQL没有那么紧密 将字符集绑定到字段类型, 而是允许一组 可以绑定到的字符类型 任意数量的字符集, 包括Unicode


使用或,它与您所输入的内容基本相同。

您可以将其作为常规十进制字段存储在数据库中,并在显示时设置数字的格式

编辑:刚刚添加了一个如何实现的示例

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

你也可以考虑将它乘以100,并将其存储为INT.

在将价格插入数据库之前:

$price = (int)$price*100;
收到DB的价格后:

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

比你想象的还要糟糕。在欧洲,数字1234.56可以写成:

  • 1234,56
  • 1234,56(空格作为组分隔符)
  • 1.234,56(dot作为分组分隔符)

  • 在.net中,数字解析器可以根据给定的区域性工作,因此,如果您知道格式,它将为您完成艰巨的工作。我相信你可以找到一个PHP等价物,这会为你节省很多麻烦。

    @S.Gehrig:正确,但考虑到OP使用的是PHP,这有点过分了。这取决于:如果OP需要在MySQL端进行一些计算(例如一些累计),他必须以适当的数据类型存储这些值。请注意money_format()在windows上未定义systems@Thilo. 是的,我认为在这种情况下它应该是一个点,因为它似乎是十进制分隔符。在英国,我们使用逗号作为千位分隔符,小数点作为小数点,例如1250.25,而法国和其他欧洲国家使用逗号作为千位分隔符,例如1.250,00。只是为了澄清一下——这不完全是mysql的问题,而是关于解析欧洲数字的问题?如果你把这个列作为一个double,你就会知道该怎么做。正如我所理解的OP,这正是他试图做的,但是失败了,因为MySQL使用点作为十进制分隔符。不能在十进制列中使用逗号存储值。
    $price = number_format($price, 2, ',', ' ');