MYSQL - 数字格式问题

时间:2011-06-29 20:05:56

标签: mysql sql-like

我现在正在进行一场演出,客户希望用户能够按产品代码搜索产品。

产品代码的格式如下:123.4567.89

因此,搜索框应该返回该产品,无论用户输入带有句点的数字,没有句点,还是带有空格。

因此,以下所有内容均应退回产品:123.4567.89,123456789,123 4567 89.

我当前的查询如下:

SELECT      *
FROM        products
WHERE       product_code LIKE '%$search_code%'"

我不知道如何修改它以包含用户输入这些数字的所有不同可能性。

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

  1. [前端] 限制用户可以输入的字符。只允许句号和空格。不允许任何字母字符(如果所有产品SKU都是数字)。

  2. [中间层] 发布表单后,请仔细检查后端无关字符的数据。如果客户端以某种方式设法在前端进行双向验证,则可以在后端捕获它。使用简单的搜索并以您选择的语言替换。

  3. [数据库/后端] 一旦数据仅限于数字并且您将SKU发送到数据库查询,请删除产品表上的所有期间。如果您知道仅使用句点存储SKU,则只需搜索除去它们,例如

  4. SELECT *
    FROM products
    WHERE REPLACE(product_code,'.','') = @productCode
    

    避免使用通配符%%搜索,它们很昂贵。

答案 1 :(得分:1)

在进行搜索之前,您必须normalize用户输入的数字,即:使其格式与数据库中存储的数字相同。

例如,如果数字存储在没有句点的数据库中(如123456789),则必须预先处理用户输入的数字,以便从中删除句点,空格和任何其他字符。

编辑:如果数字与句点一起存储在数据库中,则还需要通过删除@HertzaHaeon在其答案中指出的句点来规范化它们。

答案 2 :(得分:1)

如何删除数据库代码和searcg输入中的点和空格,所以你只有数字?像这样:

WHERE REPLACE(product_code, '.', '') LIKE '%formatted_search_code%'

对于搜索输入,您可以使用正则表达式或简单子字符串替换来删除除数字之外的所有内容。

答案 3 :(得分:1)

我认为解决问题的最佳方法是格式化搜索值,使其与数据库中使用的格式相匹配。但是,如果用户填写整个产品编号,您将只找到该产品。如果这不是理想的解决方案,并且您希望能够让用户填写产品代码的任何部分并找到包含该代码的产品,我认为您应该过滤掉数据库中的期间。 / p>

禁食的解决方案是在您的数据库中实际执行此操作。从产品代码中删除点或添加包含没有点的产品代码的额外字段。这将在数​​据集变大时加快查询速度。

如果您不想这样做,您可以随时过滤搜索查询中的点:

REPLACE(product_code,'.','') LIKE '%$search_code%'

这会很刺激,但是当数据集变大时可能会很慢。

答案 4 :(得分:1)

我一直用社会安全号码来处理这个问题。我的解决方案是取你的输入字符串,剥离和不是数字的字符,确保字符串是正确的长度,然后使用substring函数来打破字符串,然后将其与分隔符一起放回去。如果您使用的是PHP,则该函数可能如下所示:

<?php
function FormatProductCode($String) {
    $String = preg_replace("/[^0-9]/", "", $String);
    if ($String == "") {
        return null;
    }
    $String = str_pad($String, 9, "0", STR_PAD_LEFT);
    return substr($String, 0, 3) . "." . substr($String, 3, 4) . "." . substr($String, 7, 2);
}
?>

只要您需要将数据输入数据库或比较数据,就可以使用此功能。