2012-07-01 27 views
18

Tôi đang sử dụng truy vấn này để tạo trình đơn trên blog lưu trữ, như vậy:SQL CONCAT - nhân vật Funny - nhưng tôi không cười

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

Kết quả mong đợi:

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

kết quả thực tế:

enter image description here

Đếm là chính xác nhưng thay vì tâm trí phương Đông, nó sho uld read:

May 2012  1 

Làm cách nào để loại bỏ các nhân vật vui nhộn và có tiếng Anh thay thế?

Khi tôi chạy truy vấn này trong phpMyAdmin, các ký tự vẫn ổn.

CẬP NHẬT

Tôi vừa cố gắng chạy conn.Execute ("SET lc_time_names = 'en_US';") và không giải quyết vấn đề. Để kiểm tra, tôi sử dụng conn.Execute ("SELECT @@ lc_time_names;") và nó trả về "en_".

KHÁC CẬP NHẬT

tìm kiếm trên các diễn đàn MySQL cho các vấn đề liên quan, tôi thấy một anh chàng than vãn về cùng một vấn đề. Một guru MySQL nói:

"Đây là (khét tiếng) máy chủ nổi tiếng trả không đúng chủng loại cho CONCAT của một số và một chuỗi Người ta phải sử dụng (cast) hình thức này để công việc, người lái xe. không thể nói loại thực sự là gì. "

Tôi không biết dàn diễn viên là gì hoặc cách khắc phục sự cố này.

+12

+ 1 cho tiêu đề: P – Oleksi

+2

+1 cho "tinh thần phương Đông" ': P'. – Bojangles

+1

Truy vấn * tầm thường nhất * tái tạo sự cố của các ký tự "vui nhộn" là gì? Truy vấn trên là 1. truy vấn tối thiểu (cần được chỉ định) hoặc; 2. chứa một loạt các SQL không cần thiết ('GROUP BY',' CONCAT', 'MONTHNAME', v.v.). –

Trả lời

7

Máy chủ ngớ ngẩn, toán học là số.

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() Bạn cũng có thể thử DATE_FORMAT (NĂM (xuất bản), '% Y') chức năng thay vì CAST.

+0

BANG ON !! Woohoooo! – TheCarver

+0

Chỉ cần nhận thấy tôi đã không đặt CAST() trong GROUP BY! – user1166147

+0

Đó là okay, tôi nhận thấy và đặt nó vào. Cảm ơn. – TheCarver

5

Chuyển ngôn ngữ của bạn sang tiếng Anh sau đó. Sau đây cũng là SQL.

SET lc_time_names = 'en_US'; 

From here.

+0

Tôi vừa thử điều này và không giải quyết được vấn đề. Để kiểm tra, tôi sử dụng conn.Execute ("SELECT @@ lc_time_names;") và nó trả về "en_". Bất kỳ ý tưởng? – TheCarver

+0

@PaparazzoKid - Khi bắt đầu 'mysqld', hãy chỉ định tùy chọn' --skip-character-set-client-handshake'. BTW vui lòng gắn thẻ câu hỏi của bạn với hệ điều hành của bạn. –

6

Có vẻ như bạn có một bộ lc_time_names "vui nhộn".

Thử:

SET lc_time_names = 'en_US';

trước khi chạy truy vấn.

+0

Haha "vui nhộn". Tôi vừa thử điều này và không giải quyết được vấn đề. Để kiểm tra, tôi sử dụng conn.Execute ("SELECT @@ lc_time_names;") và nó trả về "en_". Bất kỳ ý tưởng? – TheCarver

+2

CHỌN MONTHNAME ('2012-05-05') có cùng tác dụng không? – LSerni

Các vấn đề liên quan