@CodeDes3D

Как правильно установить кодировку в консоли для БД?

Люди. Скажите пожалуйста - какова правильная последовательность действий, чтобы правильно расставить кодировку в СУБД, консоли и на выводе в PHP? Нигде толком ничего не объясняется, походу все пользуются PHPMyAdmin(там все работает). А я вот пытаюсь через консоль.
1. Сначала я пересохранил все страницы сайта на utf8, потом дополнительно указал заголовки и htaccess на utf8.
2. Теперь СУБД. Создал БД указав Engine = InnoDB, Charset = utf8, Collation = utf8_bin.
3. И на 3ем моменте я застрял, надолго - при вводе через консоль все вводилось замечательно и на ней же отображалось хорошо, но при запросе уже на сайте(локальный сервер) через PHP вместо русских букв выводились иероглифы. Однако, если добавлять русские буквы через PHPMyAdmin, то на стороне PHP все выводится хорошо. И еще - то что я ввел в консоли, в PHPMyAdmin тоже выводится иероглифами. В самой же консоли оно выводится нормально.

В итоге я почти добрался до решения, но как правильно его использовать - не написано. Итак:
1) Шрифт в настройках консоли должен быть Lucida
2) Открываем консоль -> меняем кодировку самой консоли(вводим на выбор из трех: chcp 866 | chcp 1251 | chcp 65001 - соотв. это cp866 | windows 1251 | utf8 ) - тут и появляется первый вопрос: А в какую кодировку переключить консоль, если БД в utf8? Логично было бы предположить что консоль надо переключить на chcp 65001, но не тут то было - консоль вышвыривает меня из mysql, как только я пытаюсь ввести в таблицу русские символы. Где логика?
3) Можно находясь в mysql в своей БД изменить кодировку и в ней указав - Set names utf8 или - Charset utf8. Открываем консоль -> chcp 65001 -> входим в mysql -> charset utf8; -> создаем таблицу -> вводим в нее русские символы -> нас снова выбрасывает - И тут появляется еще один вопрос: А в какую кодировку переключить БД, чтобы вводить русские символы, чтобы они отображались правильно и в консоли, и в PHPMyAdmin, и на сайте на стороне PHP?

Странно, но установив в консоли chcp 866 и в СУБД charset cp866, у меня все неожиданно заработало. Но меня это не устроило, почему не работает вполне логичный и универсальный вариант с надежной utf8? И как правильно все таки расставить кодировки, чтобы в будущем не было лишних "приключений"?

Дополняю:
Предположительное решение нашел вот здесь клик. Там говорится, что 'SET NAMES cp866; - для cmd windows'. Следовательно команда 'Set names' устанавливает кодировку не для БД, конвертируя ее, а устанавливает кодировку для консоли(для cmd Windows). Это решает мою проблему, потому что теперь понятно, что БД остается в utf8, просто консоли по какой-то причине нужна cp866, чтобы правильно интерпретировать русские символы. В PHPMyAdmin везде указано, что БД и таблицы остались в utf8 и utf8_bin. Хотя вот эти команды в консоли пишут немного иное:
mysql> SHOW VARIABLES LIKE 'character_set%'; 
+--------------------------+----------------------------------------------------------+ 
| Variable_name            | Value                                                    | 
+--------------------------+----------------------------------------------------------+ 
| character_set_client     | latin1                                                   | 
| character_set_connection | latin1                                                   | 
| character_set_database   | utf8                                                     | 
| character_set_filesystem | binary                                                   | 
| character_set_results    | latin1                                                   | 
| character_set_server     | utf8                                                     | 
| character_set_system     | utf8                                                     | 
| character_sets_dir       | c:\openserver\modules\database\MySQL-5.1\share\charsets\ | 
+--------------------------+----------------------------------------------------------+ 
8 rows in set (0.00 sec)                                                                
                                                                                        
mysql> SHOW VARIABLES LIKE 'collation%';                                                
+----------------------+-------------------+                                            
| Variable_name        | Value             |                                            
+----------------------+-------------------+                                            
| collation_connection | latin1_swedish_ci |                                            
| collation_database   | utf8_bin          |                                            
| collation_server     | utf8_bin          |                                            
+----------------------+-------------------+                                            
3 rows in set (0.00 sec)
Нигде четко не написано, в какую кодировку должен быть задан каждый из этих параметров для безпроблемного использования на русскоязычных сайтах. Но раз уж работает, то мне кажется проблема решена.
  • Вопрос задан
  • 2186 просмотров
Решения вопроса 1
mahoho
@mahoho
Full stack certified PHP developer.
Это потому что вы пользуетесь CMD, а там по историческим причинам кодировка CP866. Используйте Mysql Workbench, или Database Tools плагин в PhpStorm (он субъективно лучше и удобнее) - там все в порядке с кодировками, с автодополнением, статическим анализатором и прочими удобными для работы плюшками.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы