a permanent way of doing mysqli->set_charset()?

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, что делает этот обходной путь совершенно непрактичным, поскольку я просто не могу применить этот параметр ко всем серверам, на которых работает мой веб-сайт.

, поэтому я не принимаю этот обходной путь . приветствуются дальнейшие комментарии и ответы.

15
задан Community 23 May 2017 в 11:46
поделиться