18

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

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

实际结果:

在此处输入图像描述

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

May 2012       1

我怎样才能摆脱有趣的角色而改用英语?

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

更新

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

另一个更新

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

“这是著名的(臭名昭著的)服务器为数字和字符串的 CONCAT 返回错误的类型。必须使用(强制转换)形式才能工作,驱动程序无法分辨真正的类型是什么。”

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

4

3 回答 3

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))

DATE_FORMAT()您也可以尝试使用 DATE_FORMAT(YEAR(published), '%Y') 函数而不是 CAST。

于 2012-07-02T01:58:53.537 回答
6

看起来你有一个 lc_time_names 设置“有趣”。

尝试:

SET lc_time_names = 'en_US';

在运行查询之前。

于 2012-07-01T22:33:07.913 回答
5

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

SET lc_time_names = 'en_US';

从这里

于 2012-07-01T22:33:04.447 回答