Какова цель character_set_connection?
Просто прочитайте Stefan Gehrig отличный ответ на Is "SET CHARACTER SET utf8" необходимо?, что немного отличается от документации MySQL при объяснении этапов интерпретации и выполнения запроса w.r.t. наборы символов и сопоставления, но я до сих пор не могу видеть цели character_set_connection или, более конкретно, перекодирование инструкции из character_set_client в character_set_connection.
Почему бы просто не использовать character_set_client для запроса и перекодировать прямо из character_set_client в набор символов столбца при сравнении со значениями столбцов? Какова цель этого промежуточного этапа? В руководстве приведен пример сравнения литеральных укусов, но почему вы хотите сделать это в первую очередь, не говоря уже о character_set_connection, как против character_set_client? Если мое понимание этого (что-то вроде "выберите" somestr "=" somestr "из x" ) неверно.
Спасибо.
Ответы
Ответ 1
После прочтения ответов и документации я могу только подумать об одном случае использования для character_set_connection
(и _collation
):
SELECT "StringA" < "StringB"
character_set_client
имеет значение только для передачи на сервер. character_set_connection
(и сопоставление, не зависящее от набора символов) имеет значение для интерпретации утверждения. "StringA" меньше, чем "StringB", зависит от набора символов и сопоставления литералов. Разработчик может выбрать набор символов/сопоставление, отличающийся от character_set_client
.
На практике character_set_connection
не будет иметь значения большую часть времени, потому что литералы сравниваются с столбцами, и в этом случае используются кодировка столбцов и сортировка.
Исправьте меня, если я ошибаюсь!
См. https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html:
Какой набор символов должен передать сервер на утверждение после получать его? Для этого сервер использует character_set_connection и системные переменные collation_connection. Он преобразует отправленные сообщения клиентом от character_set_client к character_set_connection (за исключением строковых литералов, у которых есть интродуктор, такой как _latin1 или _utf8). collation_connection важна для сравнения литеральных строк. Для сравнения строк со значениями столбцов, collation_connection не имеет значения, потому что столбцы имеют свои собственные сопоставление, которое имеет более высокий приоритет сортировки.
Ответ 2
Оба отличаются друг от друга тем, что character_set_client
считается кодировкой, которую оператор отправляет от клиента, и, следовательно, кодировка, которую сервер использует для интерпретации оператора, а character_set_connection
- это то, что сервер преобразует оператор для обработки.
character_set_connection
используется, как обсуждалось, для сравнения литеральных строк. Это не обязательно означает, что обе стороны уравнения должны быть буквальными строками. Например:
WHERE column_name = 'literal_string'
(charset col) (charset connection)
Если наборы символов столбца и соединения различны, сравнение является незаконным и приведет к ошибке.
Результаты (и ответы) затем кодируются в character_set_results
для отправки обратно клиенту.
Ответ 3
Это потому, что MySQL позволяет каждому строковому литералу иметь свой собственный набор символов. Тем не менее, набор символов строковых литералов в инструкции не всегда совпадает с символом инструкции.
См. эту страницу в руководстве: http://dev.mysql.com/doc/refman/5.5/en/charset-literal.html
Ответ 4
> <?php
// ... (create a connection to mysql) ...
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn);
$re = mysql_query('SHOW VARIABLES LIKE "%character_set%";')or die(mysql_error());
while ($r = mysql_fetch_assoc($re))
{
var_dump ($r); echo "<br />";
}
exit;
?>
Все важные переменные теперь являются utf-8, и мы можем безопасно использовать INSERT или SELECT с mysql_escape_string ($ var) без каких-либо функций кодирования.