2012-07-01 12 views
18

Używam tę kwerendę, aby produkować menu archiwum bloga, tak jak poniżej:SQL CONCAT - Dziwne znaki - ale ja nie śmieję

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

oczekiwany wynik:

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

Rzeczywiste wyniki:

enter image description here

hrabia jest poprawna, ale zamiast psychicznego orientalne, to SHO Przeczytałeś:

May 2012  1 

Jak mogę pozbyć się zabawnych postaci i zamiast tego mieć angielski?

Po uruchomieniu tego zapytania w phpMyAdmin, znaki są w porządku.

UPDATE

Właśnie próbował działa conn.Execute ("SET lc_time_names = 'en_US';") i nie rozwiąże problemu. Aby to sprawdzić, użyłem conn.Execute ("SELECT @@ lc_time_names;") i zwróciło "en_US".

Kolejna aktualizacja

wyszukiwania na forach MySQL dla zagadnień pokrewnych, znalazłem innego faceta marudzenie o tym samym numerze. MySQL guru powiedział:

„To jest słynny serwer (niesławny) zwraca błędne typy dla CONCAT z szeregu i ciąg Trzeba użyć (CAST) formularz do tego celu pracy, kierowca. nie mogę powiedzieć, jaki jest prawdziwy typ ".

Nie jestem pewien, co to jest obsada i jak rozwiązać ten problem.

+12

+ 1 dla tytułu: P – Oleksi

+2

+1 dla "orientu mentalnego" ': P'. – Bojangles

+1

Co to jest * najbardziej banalne * zapytanie, które odtwarza problem "zabawnych" znaków? Powyższe zapytanie to 1. albo zapytanie minimalne (które powinno być określone), albo; 2. zawiera pęczek niepotrzebnego SQL ('GROUP BY',' CONCAT', 'MONTHNAME', itp.). –

Odpowiedz

7

Głupi serwer, matematyka dla liczb.

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() Można także spróbować DATE_FORMAT (rok (opublikowany), '% y') zamiast funkcji CAST.

+0

BANG ON !! Woohoooo! – TheCarver

+0

Po prostu zauważyłem, że nie dodałem CAST() w GROUP BY! – user1166147

+0

W porządku, zauważyłem i wstawiłem. Dzięki. – TheCarver

5

Przełącz na język ustawiony na angielski. Poniżej znajduje się również SQL.

SET lc_time_names = 'en_US'; 

From here.

+0

Właśnie próbowałem tego i nie rozwiązałem problemu. Aby to sprawdzić, użyłem conn.Execute ("SELECT @@ lc_time_names;") i zwróciło "en_US". Jakieś pomysły? – TheCarver

+0

@PaparazzoKid - Podczas uruchamiania 'mysqld', określ opcję' --skip-character-set-client-handshake'. Przy okazji oznacz to pytanie swoim systemem operacyjnym. –

6

Wygląda na to, że masz zestaw "lc_time_names" "zabawny".

Spróbuj:

lc_time_names SET = 'pl';

przed uruchomieniem zapytania.

+0

Haha "zabawny". Właśnie próbowałem tego i niestety nie rozwiązałem problemu. Aby to sprawdzić, użyłem conn.Execute ("SELECT @@ lc_time_names;") i zwróciło "en_US". Jakieś pomysły? – TheCarver

+2

SELECT MONTHNAME ("2012-05-05") wykazuje ten sam efekt? – LSerni

Powiązane problemy