Подтвердить что ты не робот

Какова цель 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" ) неверно.

Спасибо.

4b9b3361

Ответ 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) без каких-либо функций кодирования.