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

The*_*ver 18 mysql sql concat collation

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

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))
Run Code Online (Sandbox Code Playgroud)

预期结果:

January 2012        103
February 2012       87
March 2012          23
April 2012          99
Run Code Online (Sandbox Code Playgroud)

实际结果:

在此输入图像描述

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

May 2012       1
Run Code Online (Sandbox Code Playgroud)

我怎样才能摆脱有趣的角色而不是英语呢?

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

UPDATE

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

另一个更新

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

"这是着名的(臭名昭着的)服务器为数字和字符串的CONCAT返回错误的类型.必须使用(强制转换)表单才能使用,驱动程序无法判断真实类型是什么."

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

use*_*147 7

愚蠢的服务器,数学是数字.

CAST() CAST(enum_col AS CHAR) - 将值转换为特定类型

 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))
Run Code Online (Sandbox Code Playgroud)

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


LSe*_*rni 6

看起来你有一个lc_time_names设置为"有趣".

尝试:

SET lc_time_names ='en_US';

在运行查询之前.

  • SELECT MONTHNAME('2012-05-05')表现出同样的效果? (2认同)

Jir*_*ika 5

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

SET lc_time_names = 'en_US';
Run Code Online (Sandbox Code Playgroud)

从这里开始.