2011-05-06 43 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%')