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

Posted

技术标签:

【中文标题】如何在 MySQL 中存储欧洲货币?【英文标题】:How to store European Currency in MySQL? 【发布时间】:2009-07-13 08:26:21 【问题描述】:

在我从事的一个新项目中,我有 CSV 格式的数据要导入到 mysql 表中。其中一列是以欧洲格式存储货币的价格字段,即。 345,83。 我遇到的问题是存储这个小数分隔符。在大多数欧洲货币中,十进制分隔符是“,”,但是当我尝试将十进制数字插入字段(例如 345,83)时,我收到以下错误:“行 'row # 中列 'column_name' 的数据被截断'”。如果我使用“。”而不是','它工作正常。你能帮我看看如何在mysql中存储这种格式吗?

【问题讨论】:

只是澄清一下-这不完全是mysql问题,而是关于解析欧洲数字的问题?如果您将此专栏作为替身,您就会知道该怎么做。 【参考方案1】:

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

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

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

【讨论】:

据我了解,OP 正是他试图做的,但由于 MySQL 使用点作为小数分隔符而失败。您不能在 DECIMAL 列中存储带逗号的值。【参考方案2】:

使用number_format 或money_format,这几乎是你喜欢的。

【讨论】:

请注意,money_format() 在 Windows 系统上是未定义的【参考方案3】:

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

    1234,56 1 234,56(空格作为组分隔符) 1.234,56(点作为组分隔符)

在 .net 中,数字解析器可以根据给定的文化工作,所以如果您知道格式,它会为您完成艰苦的工作。我相信你可以找到一个 php 等价物,它会为你省去很多麻烦。

【讨论】:

【参考方案4】:

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

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

【讨论】:

@S. Gehrig:正确,但考虑到 OP 使用的是 PHP,这有点矫枉过正。 这取决于:如果 OP 必须在 MySQL 端进行一些计算(例如一些累积),他必须将值存储在适当的数据类型中。【参考方案5】:

有些数据类型没有直接 SQL Server 或 访问和 MySQL。一个例子是 CURRENCY 数据类型:MySQL 没有 (然而)有一个 CURRENCY 数据类型,但是 使用定义创建列 DECIMAL(19,4) 具有相同的目的。 虽然 MSSQL 默认为 Unicode 字符类型,例如 nCHAR 和 nVARCHAR,MySQL 没有那么紧 将字符集绑定到字段类型, 而是允许一组 可以绑定的字符类型 任意数量的字符集, 包括 Unicode。

来自http://dev.mysql.com/tech-resources/articles/migrating-from-microsoft.html

【讨论】:

【参考方案6】:

您也可以考虑将其乘以 100 并将其存储为 INT。

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

$price = (int)$price*100;

从数据库收到价格后:

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

【讨论】:

【参考方案7】:
Try replacing the "," with "."?

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

【讨论】:

@Thilo。是的,我认为在这种情况下它应该是一个点,因为它似乎是小数点分隔符。在英国,我们使用逗号作为千位分隔符,使用点作为小数点,例如1,250.25 然而,法国和其他欧洲国家反过来使用它们,例如1.250,00.

以上是关于如何在 MySQL 中存储欧洲货币?的主要内容,如果未能解决你的问题,请参考以下文章

日本欧洲六家央行联手研究数字货币 以对抗Libra/DCEP

如何在 Web 应用程序中处理和/或存储货币价值? [复制]

如何在其中存储带有逗号的货币值?

使用CodeIgniter在mySql数据库中未存储货币符号

在哪里以及如何存储货币汇率?

如何格式化欧洲语言的数字