2012-07-01 5 views
18

を笑っていないよ:SQL 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

カウントが正しいかではなく、精神的な東洋の、それは翔uldは:

May 2012  1 

私は面白い文字を削除し、代わりに英語を使用することができますか?

このクエリをphpMyAdminで実行すると、文字は問題ありません。

UPDATE私はちょうどconn.Executeを実行しようとしている

( "lc_time_namesの= 'en_USの' を設定;")、問題を解決していません。チェックするために、conn.Execute( "SELECT @@ lc_time_names;")を使用し、 "en_US"を返しました。関連する問題のためのMySQLのフォーラムで検索

別の更新

、私は別の男が同じ問題について泣き言ました。 MySQLの教祖は言った:

「これは有名な(悪名高い)サーバは数値と文字列のCONCAT の間違った種類を返します。一つは 仕事に、このため(キャスト)フォームを使用する必要があり、ドライバです。本当のタイプが何であるかを知ることはできません」

キャストがどのようなものか、この問題を解決する方法がわかりません。

+12

+ 1タイトルの場合:P – Oleksi

+2

+1「mental oriental」:「P」。 – Bojangles

+1

「面白い」文字の問題を再現する*最も些細な*クエリは何ですか?上記のクエリは、1.最小限のクエリ(指定する必要があります)または2.不必要なSQL( 'GROUP BY'、' CONCAT'、 'MONTHNAME'など)がたくさんあります。 –

答えて

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の機能を試してみてください。

+0

BANG ON !! Woohoooo! – TheCarver

+0

ちょうど私はCAST()をGROUP BYに入れなかったことに気付きました! – user1166147

+0

それは大丈夫です、私は気づいてそれを入れました。ありがとう。 – TheCarver

5

ロケールを英語に切り替えます。以下はSQLです。

SET lc_time_names = 'en_US'; 

From here

+0

私はこれを試しただけで問題は解決しませんでした。チェックするために、conn.Execute( "SELECT @@ lc_time_names;")を使用し、 "en_US"を返しました。何か案は? – TheCarver

+0

@PaparazzoKid - mysqldを起動するときに、--skip-character-set-client-handshakeオプションを指定します。お使いのオペレーティングシステムで質問にタグを付けてください。 –

6

lc_time_namesが「funny」に設定されているようです。

試してみてください。

SETのlc_time_names =の 'がen_USの';クエリを実行する前に

+0

ハハ "面白い"。私はちょうどこれを試みたが、残念ながら問題を解決しなかった。チェックするために、conn.Execute( "SELECT @@ lc_time_names;")を使用し、 "en_US"を返しました。何か案は? – TheCarver

+2

SELECT MONTHNAME( '2012-05-05')は同じ効果を発揮しますか? – LSerni

関連する問題