Как charset влияет на php при выполнении запросов MySQL? - PullRequest
0 голосов
/ 23 сентября 2019

Я заметил, что при выполнении запросов к базе данных на PHP (например, Zend_db, mysqli ...), вы можете установить набор символов.Например: mysqli_set_charset ($ con, "utf8");Я немного туманно отношусь к тому, что это на самом деле делает за кулисами.

Если я использую php для выполнения запроса SELECT к базе данных, и я указываю набор символов, что произойдет, если это не тот же набор символов, которыйстолбец был определен как в базе данных?

Я имею в виду, база данных возвращает двоичную последовательность, но что на самом деле возвращается, если символ не закодирован одинаково в двух наборах символов?Будет ли mySQL принимать внутренние двоичные данные и возвращать их «как есть»?

Или MySQL попытается преобразовать его в двоичную последовательность, эквивалентную указанному вами набору символов?

Полагаю, суть моего вопроса в том, что я хотел бы знать, как данныекодируется, когда PHP отправляет запрос, как он передается обратно из MySQL, и есть ли еще один шаг перевода после того, как PHP вернет его и сохранит в строку во внутренней памяти PHP.

Аналогично, если выделаете INSERT или обновление, как оно отправляется из PHP в MySQL?PHP конвертирует его в правильную двоичную кодировку, ТО затем отправляет в MySQL?

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Обновление:

Спасибо Raymond Nijland.Я смог исправить мою ошибку.Но я заметил, что для нестандартных символов кодировка действительно имеет значение.

Я сделал оператор select, используя $ db = new \ PDO ("mysql: host = $ host; dbname = $ database; charset =latin1 ", $ dbuser, $ dbpassword) ;.Сначала я попробовал latin1, затем я попробовал utf8.

Моя проблема заключалась в том, что у меня был столбец с зашифрованными данными, который, как мне кажется, содержал несколько странных символов.если я сделал md5 для этого поля непосредственно в запросе к базе данных, он дал мне кодировку, которая начиналась с 889 ... НО, я попытался перенести его в PHP с помощью инструкции SELECT.Если я использовал PDO с кодировкой latin1, а затем сделал MD5 () внутри PHP, он дает мне тот же хеш (889 ...).Что подразумевает, что у PHP есть точная копия двоичного файла, который находится в базе данных.НО, если бы я использовал PDO с набором символов 'UTF-8', а затем сделал MD5 () в PHP, он дал мне хэш, начинающийся с 087 ... Так что где-то должно происходить преобразование.

На данный момент моя ошибка исправлена, но мне все еще интересно, что происходит.MYSQL выполняет преобразование перед возвратом в PHP, или PDO выполняет какое-то преобразование на стороне PHP?

...