2011-05-06 42 views
8

任何想法,爲什麼這個工程合理*:MySQL的CONCAT(),下()的怪事

mysql> select lower('AB100c'); 
+-----------------+ 
| lower('AB100c') | 
+-----------------+ 
| ab100c   | 
+-----------------+ 
1 row in set (0.00 sec) 

但是,這不?

mysql> select lower(concat('A', 'B', 100,'C')); 
+----------------------------------+ 
| lower(concat('A', 'B', 100,'C')) | 
+----------------------------------+ 
| AB100C       | 
+----------------------------------+ 
1 row in set (0.00 sec) 

*明智地='我認爲它應該工作的方式'。

+0

驚人的問題!我剛剛得到了這一點,並能夠用這個線程在大約30秒內解決我的問題。謝謝@shanusmagnus。 (我同意你的明智btw ...我想不出爲什麼字符串需要保留'\ 0'只是因爲它代表了一個數字。) – 2014-01-07 15:18:59

回答

6

作爲上MySql String functions指出:


LOWER(STR)

LOWER()當施加到 二進制字符串(BINARY,VARBINARY BLOB)是無效的。


CONCAT(STR1,STR2,...)

返回從 導致串聯的參數字符串。可能有 一個或多個參數。如果所有 參數都是非二進制字符串,則 結果是非二進制字符串。如果 參數包含任何二進制字符串,則 結果是二進制字符串。 A 將數字參數轉換爲它的 等價的二進制字符串形式;如果你想避免這種情況,你可以使用明確的類型轉換,例如:


在你的代碼是經過100作爲數字使CONCAT會返回一個二進制字符串,並且當應用於二進制字符串,這就是爲什麼它沒有被轉換下是無效的。如果你要轉換,你可以試試這個:

select lower(concat('A', 'B', '100','C')); 
+0

感謝您的詳細解答 - 我查閱了您引用的文檔,但未能掌握有關數字參數如何轉換整個字符串二進制文件的部分。 – shanusmagnus 2011-05-06 14:04:04

+0

很好的解釋。謝謝。我認爲這發生在舊版本。我在5.1.73有問題。但不是在5.5.25a。 這是我的查詢(查詢的一部分) COALESCE(NULLIF(低(名稱), ''),低(CONCAT( '代理 - ',AGENT_ID))) 我已經把它改爲 COALESCE(NULLIF( ('name',''),lower(concat('Agent - ','agent_id'))) 然後它工作正常。 – cha 2014-07-11 07:36:56

2

lower用於將字符串轉換爲小寫字母。但是你的價值100被認爲是數字。如果你想仍實現小寫轉換的結果,你應該用引號括起來的數字是這樣的:

select lower(concat('A', 'B', '100','C')); 

我測試過這一點,它工作正常。

+0

理想情況下,編碼器將建立一個語言的concat字符串像PHP一樣。如果這是動態生成的(例如使用循環),每個要連接的值將被「引用」。所以我猜想concat函數的'鬆散'不是一個真正的問題。 – itsols 2011-05-06 05:37:22

-1

這裏是一個CONCAT其他例子,LIKE

LOWER(CONCAT(firstname, ' ', lastname)) LIKE LOWER('%my name%')