列数据MYSQL中的未知字符

时间:2015-10-16 08:06:59

标签: mysql sql

其中一列似乎在数据前面有某种特殊字符。当我运行此查询时:

SELECT *  FROM `stocktake_products` WHERE `stocktake_id` = 4148 AND `stocktake_product_id` = '29153796'

我没有结果,但运行这个:

SELECT *  FROM `stocktake_products` WHERE `stocktake_id` = 4148 AND `stocktake_product_id` LIKE '29153796'

我正在使用此字段来LEFT JOIN另一个表 (

SELECT
    *
FROM stocktake_scans ss
LEFT JOIN stocktake_products sp ON ss.stocktake_product_id = sp.stocktake_product_id
LEFT JOIN stocktake_staff st ON ss.stocktake_staff_id = st.stocktake_staff_id
LEFT JOIN stocktake_areas sa ON ss.stocktake_area_id = sa.stocktake_area_id
WHERE ss.stocktake_id = X
ORDER BY stocktake_scan_id ASC;

)所以我确实需要使用"="语法而不是LIKE

获取正确的产品。我尝试了TRIM(stocktake_product_id),但更新了0行。有没有其他方法可以找出那个特殊的,不可见的角色,并删除它?

谢谢!

5 个答案:

答案 0 :(得分:0)

您是否检查过列的数据类型?在我看来,stocktake_id是整数,stocktake_product_id是其他类型,如varchar?

这可能解释了LIKE运算符工作和=运算符失败?

编辑:刚刚注意到其他内容:您有29153796周围的单引号,但您在4148处没有这些引号。因此,您需要使用29153796制作字符串,这就是您需要使用LIKE进行比较的原因,请在没有单引号的情况下进行比较,它应该有效。

答案 1 :(得分:0)

请删除{big}之后的stocktake_product_id ='29153796'单引号 使用 stocktake_product_id = 29153796

答案 2 :(得分:0)

你可以尝试永远不要在table_name和column_name

的两边使用``

也许它会好的。

SELECT *  FROM stocktake_products WHERE stocktake_id = 4148 AND stocktake_product_id = '29153796'

答案 3 :(得分:0)

我认为您的stocktake_product_id是一个数字列。

由于MySQL会将字符串值('29153796')转换为float,这不是精确的数据类型。这可能会导致意想不到的结果。

请参阅MySQL documentation以获取有关数据类型转换如何运作的详细信息。

相关部分是:

  

以下规则描述了如何进行转换以进行比较   操作:

     

如果一个或两个参数为NULL,则比较结果为   NULL,除了NULL-safe< =>平等比较运算符。对于   NULL< => NULL,结果为true。无需转换。

     

如果比较操作中的两个参数都是字符串,则它们是   比较为字符串。

     

如果两个参数都是整数,则将它们作为整数进行比较。

     

如果不与a进行比较,十六进制值将被视为二进制字符串   号。

     

如果其中一个参数是TIMESTAMP或DATETIME列,那么   其他参数是常量,常量转换为时间戳   在进行比较之前。这样做更多   ODBC友好。请注意,这不是针对IN()的参数!   为安全起见,请始终使用完整的日期时间,日期或时间字符串   做比较。例如,在使用时获得最佳效果   BETWEEN与日期或时间值,使用CAST()显式转换   值到所需的数据类型。

     

如果其中一个参数是十进制值,则比较取决于   其他论点。如果是,则将参数作为十进制值进行比较   其他参数是十进制或整数值,或者是浮点数   如果另一个参数是浮点值,则返回值。

     

在所有其他情况下,参数将被比较为浮点数   (实际)数字。

使用上述知识,您的查询应如下所示:

SELECT *  FROM `stocktake_products`
WHERE `stocktake_id` = 4148 AND `stocktake_product_id` = 29153796

答案 4 :(得分:-1)

好的,从stocktake_scans导出数据后,删除特定stocktake_id的数据,从表中删除id的产品并重新加载文件,以便再次完成插入,并使用stocktake_product_id表中的stoccktake_scans的新值更新stocktake_product_id中的products列,一切似乎都有效。我不知道为什么它第一次出现问题,第一次发生在我身上。

感谢所有想要帮助的人!