after setting all config file and runtime options for charset that i can find to utf-8, new mysqli connections made with php still has its charset set to latin1, which effectively means that i have to call $mysqli->set_charset('utf8')
each time i connect.
$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}).");
i wonder if there is a permanent way of doing this?
similar problem was encountered in this post.
a "show variables like 'character_set%'
" query on the mysql server before calling $mysqli->set_charset('utf8')
shows:
(эта часть была неоднозначной в предыдущих версиях)
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, что делает этот обходной путь совершенно непрактичным, поскольку я просто не могу применить этот параметр ко всем серверам, на которых работает мой веб-сайт.
, поэтому я не принимаю этот обходной путь . приветствуются дальнейшие комментарии и ответы.