在数据库查询中使用逗号作为小数分隔符

Posted

技术标签:

【中文标题】在数据库查询中使用逗号作为小数分隔符【英文标题】:Using comma as decimal separator in database queries 【发布时间】:2018-02-08 07:03:01 【问题描述】:

我已将瑞典语区域设置为使用逗号作为小数分隔符。例如,它应该是 123,45 而不是 123.45

测试它:

echo 100/3;

它给出了理想的结果:

33,333333333333 

但是,当使用 php PDO 在数据库中获取或插入数据时,它似乎不起作用。 如果我尝试更新表格行:

$sql = "UPDATE
            table_name
        SET
            column_name = 123,45 //does not work but 123.45 works.
        WHERE   
            row_id = 1
    ";  
$q = $db->prepare( $sql );
$q -> execute();

在上面的代码中,如果我尝试使用逗号分隔符,例如会出现错误。 123,45,但如果我使用点,它会起作用。 同样,当我选择数据时

$sql = "SELECT
            column_name
        FROM
            table_name
        WHERE   
            row_id = 1
    ";  

    $q = $db->prepare( $sql );
    $q -> execute();
    $test = $q -> fetch( PDO::FETCH_COLUMN );
    var_dump($test); //string "123.45" 

它将以点作为小数分隔符返回结果。 IE。 123.45 而我想要 123,45。

我做错了什么? 编辑:列数据类型是数字,比例为 2。

【问题讨论】:

列的数据类型是什么? Change decimal separator in mysql的可能重复 @Miggy 数据类型是数字。 【参考方案1】:

这对于 MySQL 来说是不可能处理的,因为逗号也是列表中的分隔符。以下面的查询为例:

INSERT INTO table (a,b) VALUES(123,45,67)

这是什么意思?值是12345.67?还是123.4567?可能是其中之一。这将是完全模棱两可的。

我建议使用 en_US 在 PHP 中完成所有业务逻辑,并将语言环境更改为瑞典语,仅用于输出。

【讨论】:

谢谢,这是有道理的。所以我应该在插入数据库之前将 123,45 转换为 123.45,然后将数据库中的 123.45 转换回 123,45 以显示它? 可以那样做,但它很容易出错,就像你忘记做其中一个转换一样。而是在开始输出页面内容之前切换一次。当然,如果您的代码将逻辑与输出混合在一起,那么如果不进行重构,这几乎是不可能的。 我的意思是,默认使用en_US(或类似的)并切换到您想要的任何其他语言环境,仅用于将内容输出到页面。所有计算、操作和数据库查询都应使用en_US 之类的语言环境完成。 没错,但用户输入将采用本地格式,即。 123,45,所以我想在这种情况下有必要在插入数据库或进行任何计算之前将其转换为en_US 数据库中的所有数字都将采用en_US十进制格式,因此在输出到页面之前无需对其进行转换。您首先必须转换为en_US 的唯一内容是直接用户输入(即$_GET$_POST$_COOKIE$_REQUEST)。【参考方案2】:

我认为这是因为逗号被SQL错误地读取为查询语句中的逗号分隔符。

所以我认为你可以这样做:

$sql = "UPDATE
        table_name
    SET
        column_name = '123,45'
    WHERE   
        row_id = 1
"; 

【讨论】:

感谢您的回答,列数据类型是数字,所以在这种情况下不起作用。 对此感到抱歉。您可以尝试更改数据类型以使其正常工作,因为不会使用当前数据类型存储逗号 字符串周围也不能有反引号【参考方案3】:

您可以使用 PHP number_format() 函数。

此函数接受一个、两个或四个参数(不是三个):

如果只给出一个参数,number 的格式将不带小数,但在每千位之间使用逗号 (",")。

如果给定两个参数,number 将被格式化为 decimals 小数,前面有一个点(“.”),每组千位之间有一个逗号(“,”)。

如果给定所有四个参数,number 将被格式化为 decimals 小数,dec_point 代替小数点前的点 ("."),thousands_sep 代替逗号 (",")每千人之间。

示例:

<?php

$number = 1234.56;

// english notation (default)
$english_format_number = number_format($number);
// 1,235

// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;

// english notation without thousands separator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

?>

来源:http://php.net/manual/en/function.number-format.php

【讨论】:

如果其他语言环境所需的only 是数字格式,这将起作用,但是在设置语言环境时可以更改许多其他内容。见php.net/manual/en/function.setlocale.php

以上是关于在数据库查询中使用逗号作为小数分隔符的主要内容,如果未能解决你的问题,请参考以下文章

将数组存储为逗号分隔,如何使用 LINQ 进行查询?

如何格式化数据库中的双精度数据并在 Android 上使用逗号作为小数分隔符设置到 Textview

当某些行包含逗号作为千位分隔符和“标志并且没有小数的行没有标志时如何在R中读取数据

Dygraphs,逗号作为小数分隔符

如何在 Python Pandas 中使用逗号作为小数分隔符的浮点格式?

在 Visual Studio 2008 中使用设计器将逗号分隔列表作为参数传递给 db2 查询的 IN 子句