2015-10-16 59 views
3

其中一列似乎在數據前有某種特殊字符。當我運行此查詢:列數據中的未知字符MYSQL

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行已更新。有沒有其他的方法來找出這個特殊的隱形角色是什麼,並將其刪除?

謝謝!

+0

爲什麼你不能使用'LIKE'?沒有特殊的,不可見的字符以及... – Legionar

+0

您可以只更新字段 – CFreitas

+0

@Legionar我試圖在長查詢中使用LIKE,但它已經崩潰了MySql服務器。我正在從bigint數據字段中創建一個字符串,這就是爲什麼它沒有返回結果。仍然沒有解釋爲什麼它沒有正確鏈接到另一個表。 stocktake_product_id in stocktake_scans是一個int數據類型嗎? – ArtleMaks

回答

0

您是否檢查過列的數據類型?在我看來,stocktake_id是整數,stocktake_product_id是一些其他類型,如varchar?

這可能解釋LIKE運算符工作和=運算符失敗?

編輯:只是注意到別的東西:你有單引號圍繞29153796,但你沒有這些在4148。所以你在製作一個字符串出29153796這就是爲什麼你需要使用LIKE比較,嘗試沒有單引號,它應該工作。

+0

是的,我在做錯誤的查詢。 stocktake_product_id在stocktake_products表中是bigint(20)。它需要在stocktake_scans表中鏈接到stocktake_product_id,這是int(11)。這可能會導致問題嗎? 29153796不應超出最大整數值(2,147,483,647 - 我是否正確?) – ArtleMaks

0

請自BIGINT 使用刪除stocktake_product_id =「29153796」單引號 stocktake_product_id = 29153796

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – Chris

+0

我試着用我在c#中的知識給出答案,因爲我在c#中只有1個月的經驗[除了基礎知識] :( – Akhil

+0

我在說你的答案是錯的或正確的,但是這種回答應該作爲評論發佈。如果你仍然不能發表評論,請等到你獲得特權,或者當然試圖提供完整的答案 – Chris

-1

好了,所以從stocktake_scans導出數據,爲特定stocktake_id刪除數據,刪除產品從表中,經過id並重新下載文件,以便插入完成,並更新stocktake_product_idstoccktake_scansstocktake_product_id的新值在products表中,一切似乎都奏效了。我不知道爲什麼它第一次出現問題,第一次它發生在我身上。

感謝大家試圖給予幫助!

0

你可以嘗試從不使用``在table_name和column_name的兩側

也許它會好的。

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

我假設你的stocktake_product_id是一個數字列。

由於MySQL會將字符串值('29153796')轉換爲float,這不是一個精確的數據類型。這可能會導致意想不到的結果。

請參閱MySQL documentation以獲取有關數據類型轉換如何工作的更多信息。

相關部分是這樣的:

下面的規則描述瞭如何轉換髮生比較 操作:

如果一個或兩個參數是NULL,比較的結果是 NULL,除了爲NULL安全的< =>相等比較運算符。對於 NULL < => NULL,結果爲true。不需要轉換。

如果比較操作中的兩個參數都是字符串,則它們是作爲字符串比較的 。

如果兩個參數都是整數,則將它們作爲整數進行比較。

如果未將其與 編號進行比較,則將十六進制值視爲二進制字符串。

如果其中一個參數是TIMESTAMP或DATETIME列,而其他參數是常量,則常量將在執行比較之前轉換爲時間戳 。這樣做更適合於ODBC友好。請注意,這不是針對IN()的參數完成的! 爲了安全起見,當 進行比較時,請始終使用完整的日期時間,日期或時間字符串。例如,要在使用日期或時間值BETWEEN時使用CAST()將 值顯式轉換爲所需的數據類型以獲得最佳結果。

如果其中一個參數是十進制值,則比較結果取決於其他參數 。如果 其他參數是十進制或整數值,則將參數作爲十進制值進行比較,如果另一個參數爲浮點值,則將參數作爲浮點型 值進行比較。

在所有其他情況下,將參數作爲浮點數 (實數)進行比較。

使用上面的知識,您的查詢應該是這樣的:

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