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()CAST の代わりに DATE_FORMAT(YEAR(published), '%Y') 関数を試すこともできます。

于 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 に答える