包含CONCAT()
的MySQL查询意外截断结果并仅返回预期的6个字符中的5个('abcd2'而不是abcd21')。
实际查询的精简版本如下:
SELECT c.cid, c.club, c.crewno, CONCAT(c.club,c.crewno) crewcode
FROM `crews` c
LEFT JOIN `results` r ON r.rno=c.cid
GROUP BY c.cid;
以上查询返回:
54321, 'abcd', 21, 'abcd2'
65432, 'abcd', 1, 'abcd1'
但是,如果删除LEFT JOIN
和/或删除了GROUP BY
,则CONCAT()
按预期工作并返回:
54321, 'abcd', 21, 'abcd21'
65432, 'abcd', 1, 'abcd1'
我不知道问题是什么......
其他信息:字段c.club
的类型为VARCHAR(4)
,字段c.crewno
的类型为TINYINT(1) UNSIGNED
。结果不受结果表是否包含要加入的行的影响。
使用TRIM(CONCAT(c.club,c.crewno,' '))
进行临时解决方法,返回预期值:
54321, 'abcd', 21, 'abcd21'
65432, 'abcd', 1, 'abcd1'
然而,我不想忍受一个丑陋的解决方法,而是更愿意了解潜在的问题并正确解决它!
编辑1:如果使用三位数crewno
,则仅返回第一个数字并使用我的解决方法获取所有三个数字我需要添加一个双空格TRIM(CONCAT(c.club,c.crewno,' '))
。
编辑2:SQL用于设置表以演示问题如下。这不是生产SQL,而是复制问题所需的最小字段集。 (注意:当结果表完全为空时,CONCAT()
按预期工作,但只要有数据,CONCAT
就会返回意外结果)
CREATE TABLE IF NOT EXISTS `crewsmin` (
`cid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`club` varchar(4) NOT NULL DEFAULT '',
`crewno` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`cid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1;
INSERT INTO `crewsmin` (`cid`, `club`, `crewno`) VALUES
(12345, 'abcd', 0),
(12346, 'bcde', 5),
(12347, 'cdef', 13),
(12348, 'defg', 42),
(12349, 'efgh', 107);
CREATE TABLE `resultsmin` (
`rid` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`cid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`result` tinyint(3) NOT NULL DEFAULT '0',
PRIMARY KEY (`rid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=1;
INSERT INTO `resultsmin` (`rid`, `cid`, `result`) VALUES
(1, 12345, 3),
(2, 12345, 1);
SELECT c.cid, c.club, c.crewno, CONCAT(c.club,c.crewno) crew
FROM crewsmin c
LEFT JOIN resultsmin r ON r.cid=c.cid
GROUP BY c.cid;
答案 0 :(得分:3)
当您将CONCAT与数值一起使用时,似乎是MySQL doesn't always do what you would expect。您应该对数值使用CAST:
CONCAT(c.club,CAST(c.crewno AS CHAR))