Вот краткое изложение того, какие переменные установлены каждым оператором:
Variable SET NAMES SET CHARSET
character_set_client argument argument
character_set_results argument argument
character_set_connection argument default for default db
collation_connection argument* default for default db
Таким образом, самое большое отличие состоит в том, что SET CHARSET не устанавливает кодировку соединения в кодировку, указанную в аргументе, а устанавливает ее в кодировку для текущей базы данных по умолчанию, то есть, если вы сделали USE <database>
.
Почему существуют оба утверждения? Я не знаю, я проверил руководство полностью назад к MySQL 4.1, и оба утверждения есть, но без объяснения того, почему им нужны два утверждения.
Я бы предположил, что это для совместимости с другими реализациями SQL.