SQL CONCAT - 有趣的角色 - 但我不笑

时间:2012-07-01 22:27:05

标签: mysql sql collation concat

我正在使用此查询生成博客存档菜单,如下所示:

SELECT CONCAT( MONTHNAME(published) , ' ' , YEAR(published)) AS monthyear, 
COUNT(*) AS total
FROM blog_articles
WHERE status = 'Online' AND Year(published) = 2012
GROUP BY CONCAT( MONTHNAME(published) , ' ' , YEAR(published))

预期结果:

January 2012        103
February 2012       87
March 2012          23
April 2012          99

实际结果:

enter image description here

计数是正确的,但不是精神东方,它应该是:

May 2012       1

我如何摆脱有趣的角色并改为使用英语?

当我在phpMyAdmin中运行此查询时,字符很好。

更新

我刚尝试运行conn.Execute(“SET lc_time_names ='en_US';”)并没有解决问题。为了检查,我使用了conn.Execute(“SELECT @@ lc_time_names;”)并返回“en_US”。

另一个更新

在MySQL论坛上搜索相关问题,我发现另一个人抱怨同样的问题。一位MySQL大师说:

  

“这是着名的(臭名昭着的)服务器为CONCAT返回错误的类型   一个数字和一个字符串。必须使用(演员)形式   工作,司机无法分辨真实的类型。“

我不确定演员是什么或如何解决这个问题。

3 个答案:

答案 0 :(得分:7)

愚蠢的服务器,数学用于数字。

CAST() CAST(enum_col AS CHAR) - cast a value as a certain type

 SELECT CONCAT( CAST(MONTHNAME(published) as char) , ' ' , CAST(YEAR(published)) as char) AS monthyear, 
 COUNT(*) AS total
 FROM blog_articles
 WHERE status = 'Online' AND Year(published) = 2012
 GROUP BY CONCAT( MONTHNAME(published) , ' ' , YEAR(published))

DATE_FORMAT()您也可以尝试DATE_FORMAT(YEAR(已发布),'%Y')函数而不是CAST。

答案 1 :(得分:6)

看起来你设置了lc_time_names"搞笑"。

尝试:

SET lc_time_names =' en_US';

在运行查询之前。

答案 2 :(得分:5)

然后将您的语言环境切换为英语。以下是SQL。

SET lc_time_names = 'en_US';

From here