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]()
Счет верен, но вместо ментального востока он должен читать:
May 2012 1
Как я могу избавиться от забавных персонажей и вместо этого иметь английский?
Когда я запускаю этот запрос в phpMyAdmin, символы в порядке.
UPDATE
Я только что попробовал запустить conn.Execute( "SET lc_time_names = 'en_US';" ) и не решил проблему. Чтобы проверить, я использовал conn.Execute( "SELECT @@lc_time_names;" ), и он вернул "en_US".
ДРУГОЕ ОБНОВЛЕНИЕ
Поиск на форумах MySQL по смежным вопросам, я нашел другого парня, скулящего по той же проблеме. Гуру-гуру сказал:
"Это знаменитый (позорный) сервер возвращает неправильные типы для CONCAT числа и строки. Для этого нужно использовать форму (cast) для работа, драйвер не может определить, что такое настоящий тип."
Я не уверен, что такое бросок или как исправить эту проблему.
Ответы
Ответ 1
Глупый сервер, математика для чисел.
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 (опубликовано), '% Y').
Ответ 2
Похоже, что у вас есть lc_time_names, заданный "смешно".
Try:
SET lc_time_names = 'en_US';
перед запуском запроса.
Ответ 3
Переключите свой язык на английский. Ниже также SQL.
SET lc_time_names = 'en_US';
Отсюда.