после установки всех конфигурационных файлов и параметров времени выполнения для кодировки, которую я могу найти для utf-8, новые соединения mysqli, выполненные с php, все еще имеют набор символов для latin1, что фактически означает, что я должен называть $mysqli->set_charset('utf8')
каждый раз, когда я подключения.
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_error)
err_handle("mysql connect error({$mysqli->connect_errno}).");
if (!$mysqli->set_charset("utf8"))
err_handle("db error({$mysqli->errno}).");
Интересно, существует ли постоянный способ сделать это?
Аналогичная проблема возникла в этом сообщении.
a "show variables like 'character_set%'
" запрос на сервере mysql перед вызовом $mysqli->set_charset('utf8')
показывает:
(эта часть была неоднозначной в предыдущих версиях)
character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_filesystem binary
character_set_results latin1
character_set_server utf8
character_set_system utf8
клиентская, соединительная и итоговая кодировка могут быть изменены только в utf8 с $mysqli->set_charset('utf8')
во время выполнения. после этого он показывает:
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
У меня есть
default_charset = "utf-8"
установить в php.ini и
[client]
default-character-set=utf8
...
[mysqld]
## This option is deprecated in favor of --character-set-server.
#default-character-set=utf8
установить в my.cnf.
стандартная кодировка для моих таблиц также является utf8.
похоже, что опции "[клиент]" влияют только на инструмент cmd "mysql" и не имеют никакого отношения к php.
возвращаемое значение $mysqli->character_set_name()
всегда latin1 независимо от того, что я делаю, до тех пор, пока не будет вызываться $mysqli->set_charset('utf8')
.
Я думаю, что "latin1" - это вещь mysql, так как я не могу вспомнить все остальное, что по умолчанию означает "latin1" в моей системе.
^ update: согласно руководству mysql 9.1.4, 9.1.5 и 5.1.3, character_set_client
должен быть предоставлен клиентом. Я думаю, php не предоставляет его при подключении, а mysql использует сокращенную кодировку latin1.
Я запускаю php 5.3 на debian wheezy с mysql 5.1.
любое предложение?
обновлен с информацией из комментариев:
Я забыл упомянуть директиву skip-character-set-client-handshake
и почему я не хотел ее использовать.
на первый взгляд я думал, что игнорирование рукопожатия может привести к ситуации, когда клиент говорит latin1, а сервер говорит utf8. как сервер преобразует строку из charset character_set_client
в character_set_server
, не зная, что используемая в данный момент кодировка?
исправьте меня, если я ошибаюсь, плз. Я буду экспериментировать с этим параметром позже сегодня, чтобы узнать, работает ли он.
Обновлено с помощью workaroud:
убедитесь, что все работает под utf-8 (или любой предпочтительной кодировкой). затем добавьте строку skip-character-set-client-handshake
в my.cnf
.
это работает для меня до сих пор. Я экспериментировал с некоторыми символами utf-8 двойной ширины. оба insert
и select
преуспели и правильно отображались в браузере.
то, что пропускает рукопожатие, пока неясно. и сервер mysql теперь становится неспособен использовать любую кодировку, кроме utf-8, whick делает это обходное решение довольно непрактичным, поскольку я просто не могу применить этот параметр ко всем серверам, на которых работает мой сайт.
поэтому я не принимаю это решение. дальнейшие комментарии и ответы очень ценятся.