如何在 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 应用程序中处理和/或存储货币价值? [复制]