php
  • mysql
  • timezone
  • 2011-12-08 22 views 7 likes 
    7

    Tengo un problema extraño relacionado con la zona horaria mysql.Cómo configurar correctamente la zona horaria mysql

    En mi página web el archivo de configuración que tengo esta línea que establece la zona horaria:

    mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that 
    

    La parte divertida es que si puedo añadir otra línea justo después de esto así:

    $q = mysql_query("SELECT NOW() as now"); 
    $row = mysql_fetch_array($row); 
    echo $row["now"]; 
    

    Después de ejecutar ese código, la hora se muestra correctamente.

    PERO, en algunas otras consultas, inserto filas en las tablas que tienen una columna llamada fecha que por defecto es CURRENT_TIMESTAMP.

    filas se insertan como esto:

    INSERT INTO `sessions` (`user_id`) VALUES `1` 
    

    (La tabla de sesiones tiene una columna date que por defecto es CURRENT_TIMESTAMP)

    Pero el valor insertado en el PP aún apunta de nuevo a la zona horaria del servidor: ((

    alguna idea de cómo trabajar a través de este?

    +0

    Cuando dice que los valores insertados en DB apuntan a la zona horaria del servidor, ¿cómo verifica? ¿También a través de una conexión donde hiciste el truco 'SET SESSION time_zone'? – Romain

    +0

    ¿está cerrando la conexión antes de ejecutar el 'INSERT'? – ManseUK

    +0

    Lo estoy comprobando en phpMyAdmin, y no se ha cerrado la conexión hasta el final de la ejecución de la secuencia de comandos –

    Respuesta

    19

    hay que entender que MySQL mantiene múltiples ti Me configuración de la zona: zona horaria

    • sistema (básicamente la zona horaria establecida en el sistema operativo) Zona
    • servidor de tiempo (la zona horaria utilizada por MySQL)
    • zona horaria del cliente (la zona horaria de sesión utilizada por conexión)

    Ver http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html para más detalles. valores/hora

    de fecha se almacenan en dos formas diferentes: los valores basados ​​

    • Toda marca de tiempo Unix siempre se almacenan en UTC. Se convierten internamente desde y hacia la zona horaria del Cliente sobre la marcha cuando se almacenan y se leen. Lo mismo es cierto para las funciones NOW() y CURTIME() ya que están basadas en la marca de tiempo.
    • Las columnas DATE, TIME y DATETIME (que almacenan sus valores en un formato año-mes-día hora-minutos-segundo) NO se ven afectadas por la configuración de zona horaria y nunca se convierten.

    De lo anterior, debe quedar claro que los valores que se ven cuando se lee de las columnas basadas en la marca de tiempo de Unix no son necesariamente lo que realmente se almacena en la base de datos. Se convierten utilizando la zona horaria del servidor y la zona horaria del cliente. El resultado puede ser confuso si no entiendes los detalles de la mecánica.

    Para una primera prueba de tratar de averiguar la configuración actual en cada uno de sus clientes mediante la ejecución de programas

    SELECT @@global.time_zone, @@session.time_zone; 
    

    La zona horaria mundial siempre será el mismo. Pero la zona horaria de la sesión puede diferir de la aplicación cliente a la aplicación cliente y cambiará los resultados de sus operaciones de lectura y escritura.

    +2

    ¡Gracias, muy enlightning de hecho! Me di cuenta de que phpMyAdmin estaba mostrando los tiempos convertidos a la zona horaria del servidor, pero si los leí desde DB en mi script después de configurar la zona horaria de la sesión aparecen correctamente, así que era solo phpMyAdmin lo que me confundía :) –

    +0

    @DanyKhalife Gracias por comentar sobre esto , pensé que me estaba volviendo loco. – Mark

    +0

    @Jpsy Greate answer..i have query ¿cómo se establece la zona horaria del cliente en el archivo mysql confiq ??? – goodyzain

    Cuestiones relacionadas