Меня уже долгое время смущал вариант "настройки" кодировки от
$continue$, ибо хоть я особо и не интересовался никогда ковырянием кодировки в MySQL
(просто нужды не было), но знал, что вот этот запрос:
является групповым. То бишь, отправляя этот единственный запрос, Вы, сразу настраиваете три параметра
(*документация*) и он равносилен таким трём запросам:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET collation_connection = @@collation_database;
И если взглянуть на запросы, которые $continue$ предлагает отправлять, можно заметить там идентичные запросы.
Но если про "SET CHARACTER SET" я узнал совершенно "случайно", то с запросом "SET NAMES" мне так не повезло и до текущего момента я не знал какие запросы он в себе скрывает. В итоге,
документация говорит про три таких запроса:
SET character_set_client = utf8;
SET character_set_connection = utf8;
SET character_set_results = utf8;
И вновь мы видим запросы на изменение тех же опций, которые мало того, что содержатся в "SET CHARACTER SET", так ещё и впоследствии изменяются отдельными запросами с "utf8" на "cp1251".
Иными словами, таким вот "решением проблемы с кодировкой", которое дано в теме, Вы каждый раз будете "дёргать" одни и те же опции, изменяя их значение с одного на другое.
На этой ноте можно было бы закончить, но мне стало интересно окончательно закрыть тему кодировки для SA-MP. И я был бы не я, если бы не поделился найденной информацией с Вами :) Заодно, если я вдруг ошибусь, кто-то сможет меня поправить.
Маленькая оговорка касаемо определений:
Сервер - это наш сервер MySQL с базами дарных, блекджеком и всем остальным.
Клиент - это, в нашем случае, сервер SA-MP
Так же стоит понимать, что все опции настраивают именно сервер MySQL. Даже опция, связанная с кодировкой запросов от клиента, влияет именно на сервер, так как именно он будет заниматься конвертированием данных. То бишь, уяснили: все операции с данными происходят не на стороне сервера SA-MP или плагина, а именно на стороне сервера MySQL. И всеми опциями мы лишь сообщаем серверу MySQL нужную информацию для того, чтоб он совершил конвертирование.
Давайте разберёмся с основными опциями, которые нам могут пригодится. В случае с SA-MP нам потребуется всего несколько, так как остальные MySQL либо самостоятельно подстроит под эти запросы, либо они уже настроены как надо по умолчанию.
- character_set_client - В этой опции указaывается кодировка, в которой будут поступать данные от клиента к серверу.
- character_set_results - В этой опции указывается кодировка, в которую сервер конвертирует данные перед отправкой их клиенту.
- character_set_connection - В этой опции указывается кодировка, в которую сервер перекодирует данные, полученные от клиента, перед тем, как начнёт выполнять запрос (клиент->character_set_connection->сервер)
Собственно, всё. Опция collation_connection, которую предлагает настроить $continue$, для каждой кодировки имеет установку по умолчанию, которая, в случае с utf8, будет равна как раз "utf8_general_ci", поэтому определять её самостоятельно нет смысла.
Открыть/закрытьЕсли кому интересно, посмотреть "настройки по умолчанию" для той или иной кодировки можно при помощи запроса
PHP код:
SHOW COLLATION WHERE charset = 'имя_кодировки';
Результатом запроса будет список всех доступных вариантов представления для указанной кодировке и напротив того представления, которая является представлением по умолчанию, в столбце "Default" будет стоять "Yes".
Вот пример результата для utf8
PHP код:
SHOW COLLATION WHERE charset = 'utf8'
Теперь осталось действительно решить все проблемы с кодировкой, дабы всё работало как надо.
В чём заключается проблема? В том, что
сервер не знает в какой кодировке работает клиент, из-за чего не может правильно конвертировать данные, пришедшие от клиента и подготовить данные к отправке для клиента. И если Вы взгляните на те 3 опции, что я перечислил выше, то найдёте решение всем проблемам.
Я не зря расписал то, в чём заключается проблема, ибо если Вы сейчас перечитаете составленное мной определение, то увидите, что в обоих случаях фигурирует именно клиент. А с какой кодировкой работает наш клиент? Правильно, cp1251. Поэтому все те свистопляски с 'utf8', которые устроил $continue$ в своём варианте, бессмысленны
(можно разве что в character_set_server передавать "utf8", если Вы не уверены в том, что сервер MySQL изначально настроен под эту кодировку).