после установки всех конфигурационных файлов и опций времени выполнения для набора символов, которые я могу найти в utf-8, для новых соединений mysqli, установленных с помощью php, по-прежнему установлено значение charset, равное 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}).");
Интересно, есть ли постоянный способ сделать это?
похожая проблема возникла в этом посте .
запрос "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.
похоже, что параметры "[client]" влияют только на инструмент cmd "mysql" и не имеют ничего общего с php.
Возвращаемое значение $mysqli->character_set_name()
всегда latin1 , независимо от того, что я делаю, до тех пор, пока не будет вызван $mysqli->set_charset('utf8')
.
Полагаю, что "latin1" - вещь, связанная с mysql, так как я не могу вспомнить ничего, что по умолчанию равно "latin1" в моей системе.
^ обновление: в соответствии с руководством 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 . как сервер преобразует строку из кодировки character_set_client
в character_set_server
, не зная, какая кодировка используется в данный момент?
поправьте меня, если я не прав, плз. Я поэкспериментирую с этим параметром позже сегодня, чтобы проверить, работает ли он.
Обновлено с workaroud :
убедитесь, что все работает под utf-8 (или любой другой предпочтительной кодировкой). затем добавьте строку skip-character-set-client-handshake
к my.cnf
.
это работает для меня до сих пор. я экспериментировал с некоторыми символами utf-8 двойной ширины. insert
и select
успешно выполнены и правильно отображаются в браузере.
что означает пропуск рукопожатия, до сих пор неясно. и сервер MySQL теперь не может использовать любую кодировку, кроме utf-8, что делает этот обход весьма непрактичным, поскольку я просто не могу применить этот параметр ко всем серверам, на которых работает мой веб-сайт.
так что я не принимаю этот обходной путь. дальнейшие комментарии и ответы приветствуются.