después de configurar todas las opciones de archivo de configuración y tiempo de ejecución para el conjunto de caracteres que puedo encontrar en utf-8, las nuevas conexiones mysqli hechas con php todavía tienen su conjunto de caracteres en latin1, lo que significa que tengo que llamar al $mysqli->set_charset('utf8')
cada vez que me conecto.una forma permanente de hacer mysqli-> set_charset()?
$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}).");
¿Me pregunto si hay una manera permanente de hacer esto?
se encontró un problema similar en this post.
un "show variables like 'character_set%'
" consulta en el servidor MySQL antes de llamar $mysqli->set_charset('utf8')
espectáculos:
(esta parte fue ambiguo en revoluciones anteriores)
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
el cliente, la conexión y los resultados de juego de caracteres sólo se puede cambiar a utf8 con $mysqli->set_charset('utf8')
en tiempo de ejecución. después de que se muestra:
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
tengo
default_charset = "utf-8"
conjunto en php.ini, y
[client]
default-character-set=utf8
...
[mysqld]
## This option is deprecated in favor of --character-set-server.
#default-character-set=utf8
conjunto en my.cnf.
el juego de caracteres predeterminado para mis tablas también es utf8.
parece que las opciones "[cliente]" solo afectan a la herramienta cmd "mysql" y no tienen nada que ver con php.
el valor de retorno de $mysqli->character_set_name()
es siempre latin1 no importa lo que hago, hasta $mysqli->set_charset('utf8')
se llama.
supongo que "latin1" es una cosa de mysql, ya que no puedo recordar nada más que por defecto es "latin1" en mi sistema.
^actualización: de acuerdo al manual de MySQL 9.1.4, 9.1.5 y 5.1.3, character_set_client
debe ser proporcionada por el cliente. Supongo que php no lo proporciona en la conexión y mysql utiliza el juego de caracteres alternativo latin1.
estoy ejecutando php 5.3 en debian wheezy con mysql 5.1.
¿Alguna sugerencia?
actualizado con información de:
i olvidó mencionar la Directiva skip-character-set-client-handshake
y por qué yo era reacio a utilizarlo.
a primera vista pensé ignorando el apretón de manos podría dar lugar a la situación de que el cliente habla latin1 mientras que las conversaciones servidor UTF-8.¿Cómo convierte el servidor la cadena del juego de caracteres character_set_client
al character_set_server
sin conocer el juego de caracteres actualmente en uso?
corrígeme si me equivoco, por favor. Voy a experimentar con esta configuración más tarde para ver si funciona.
actualiza con workaroud:
asegurarse de que todo funciona bajo UTF-8 (o cualquier juego de caracteres preferible). luego agregue la línea skip-character-set-client-handshake
al my.cnf
.
esto funciona para mí hasta ahora. Experimenté con algunos caracteres de doble ancho utf-8. ambos insert
y select
tuvieron éxito y se muestran correctamente en el navegador.
qué significa omitir el saludo de manos aún no está claro. y el servidor mysql ahora se vuelve incapaz de usar cualquier conjunto de caracteres excepto utf-8, lo que hace que esta solución no sea práctica ya que simplemente no puedo aplicar esta configuración a todos los servidores en los que se ejecuta mi sitio web.
así que no estoy adoptando esta solución. otros comentarios y respuestas son muy apreciados.
¿Ha intentado cambiar la configuración regional del sistema con 'setlocale()'? – Narf
@Narf las configuraciones regionales que están disponibles para php (salida de 'locale -a') en mi sistema son C, POSIX y en_US.utf8. además, 'setlocale()' no puede ser una solución permanente ya que _ "la información de la configuración regional se mantiene por proceso" _, según el manual php. –
en_US.utf8 sería el correcto si esto debería funcionar. Es lógico que el conjunto de caracteres predeterminado para cada programa se establezca como la configuración regional actual del sistema, a menos que se configure de otra manera. Si ejecuta PHP como un módulo de Apache, podría establecerse la configuración regional como una directiva apache o incluso podría establecer que la configuración regional predeterminada del sistema sea en_US.utf8. De todos modos ... es solo un pensamiento en caso de que nada más funcione. – Narf