我对MySQL CONCAT()
函数有一些问题。我执行了如下命令:
SELECT CONCAT(now(),now())
我得到的结果是:
323031342d30352d30352031343a33393a3535323031342d30352d30352031343a33393a3535
不确定到底发生了什么?有人见过这个吗?这发生在连接任何东西(列,字符串,mysql函数,如now()
)
我的服务器版本是5.1.63 - SUSE MySQL RPM
",客户端版本是libmysql - mysqlnd 5.0.7-dev - 091210 - $Revision: 304625 $
看起来像是可打印ASCII字符的十六进制表示:
hex: 32 30 31 34 2d 30 35 2d 30 35 20 31 34 3a 33 39 3a 35 35
char: 2 0 1 4 - 0 5 - 0 5 1 4 : 3 9 : 5 5
我无法解释为什么客户端将字符数据显示为十六进制;我会调查在字符集编码中存在不匹配的可能性。
可能MySQL客户端库正在使用latin1,但应用程序正在使用不同的编码;但我们希望这将影响所有字符表达式,而不仅仅是CONCAT()表达式。
实际上,客户端更有可能显示二进制字符串的十六进制,并且CONCAT()返回的值被报告为二进制字符串。
下面是MySQL 5.1文档中CONCAT()函数的节选:
因此,解决方法可能是将NOW()的值转换为字符,使用CAST或可能使用DATE_FORMAT函数,例如返回连接参数所产生的字符串。五月有一个或多个争论。如果所有参数都是非二进制字符串,结果是一个非二进制字符串。如果参数包含任何二进制字符串,的结果是一个二进制字符串。数值参数是转换为其等效的二进制字符串形式;如果你想避免因此,您可以使用显式类型强制转换,如下例所示:
SELECT CONCAT(CAST(int_col AS CHAR), char_col);
CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s'),DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s'))