O LindormTable 2.7.6 e versões posteriores oferecem suporte a múltiplos fusos horários. As versões anteriores são fixas em UTC+8, fuso horário da Java Virtual Machine (JVM) em execução no servidor. Este documento explica como definir um fuso horário no nível de sessão para que os dados TIMESTAMP sejam retornados no fuso horário esperado pela sua aplicação.
Funcionamento das configurações de fuso horário
O LindormTable utiliza uma variável de fuso horário no nível de sessão. Cada conexão possui configuração independente. Alterar o fuso horário da sessão não afeta outras conexões nem o padrão do servidor.
Apenas o tipo de dado TIMESTAMP é afetado pelas configurações de fuso horário. Os valores DATE e TIME são armazenados como strings simples e sempre retornados sem alterações.
|
Tipo de dado |
Formato |
Sensível a fuso horário |
|
DATE |
|
Não |
|
TIME |
|
Não |
|
TIMESTAMP |
|
Sim — exibido no fuso horário da sessão |
Pré-requisitos
Antes de começar, certifique-se de que:
A versão do LindormTable seja 2.7.6 ou posterior. Para verificar ou atualizar a versão, consulte Release notes of LindormTable e Upgrade the minor engine version of a Lindorm instance
A aplicação se conecte ao LindormTable pelo protocolo MySQL. A configuração de fuso horário tem suporte apenas no protocolo MySQL. Para mais detalhes, consulte Use the MySQL protocol to develop applications (recommended)
Caso não consiga atualizar o LindormTable para a versão 2.7.6 ou posterior no console do Lindorm, entre em contato com o suporte técnico (ID do DingTalk: s0s3eg3).
Defina o fuso horário da sessão
O fuso horário padrão é UTC+8. Use a instrução SET para alterar o fuso horário da conexão atual. Essa configuração aplica-se exclusivamente à conexão em uso, sem impactar outras conexões ou os padrões globais. Para a sintaxe completa, consulte Session variables.
-- Set to UTC
SET @@time_zone = 'UTC';
-- Set to UTC+8
SET @@time_zone = '+08:00';
-- Set to Shanghai local time
SET @@time_zone = 'Asia/Shanghai';
Para verifique a configuração atual:
SELECT @@time_zone;
Exemplos
MySQL command-line tool
Para instruções de conexão, consulte Use a MySQL client to connect to and use LindormTable.
O exemplo abaixo cria uma tabela e insere uma linha com valores de data, hora e timestamp, demonstrando como a coluna TIMESTAMP se comporta ao alternar entre fusos horários.
Configurar a tabela:
-- Create the table
CREATE TABLE tb (p1 INT, c1 DATE, c2 TIME, c3 TIMESTAMP(3), PRIMARY KEY (p1));
-- Insert a row
UPSERT INTO tb (p1, c1, c2, c3) VALUES (1, '2024-08-30', '08:11:15', '2024-08-30 08:11:15.354');
Consultar em UTC+8 (padrão):
-
Verifique o fuso horário atual.
SELECT @@time_zone;Saída esperada:
+-------------+ | @@time_zone | +-------------+ | +08:00 | +-------------+ -
Consulte a tabela.
SELECT * FROM tb;Saída esperada:
+------+------------+----------+-------------------------+ | p1 | c1 | c2 | c3 | +------+------------+----------+-------------------------+ | 1 | 2024-08-30 | 08:11:15 | 2024-08-30 08:11:15.354 | +------+------------+----------+-------------------------+
Alternar para UTC e consultar novamente:
-
Altere o fuso horário para UTC.
SET @@time_zone = 'UTC'; -
Confirme a alteração.
SELECT @@time_zone;Saída esperada:
+-------------+ | @@time_zone | +-------------+ | UTC | +-------------+ -
Consulte a tabela novamente.
SELECT * FROM tb;Saída esperada:
+------+------------+----------+-------------------------+ | p1 | c1 | c2 | c3 | +------+------------+----------+-------------------------+ | 1 | 2024-08-30 | 08:11:15 | 2024-08-30 00:11:15.354 | +------+------------+----------+-------------------------+
Os valores de c1 (DATE) e c2 (TIME) permanecem inalterados por não serem sensíveis ao fuso horário. Já o valor de c3 (TIMESTAMP) muda de 08:11:15 para 00:11:15 — uma diferença de 8 horas que reflete a conversão de UTC+8 para UTC.
Java
Para instruções de conexão, consulte Use Java JDBC APIs to develop applications.
O driver MySQL Connector/J oferece dois parâmetros que atuam em conjunto para controlar o fuso horário da conexão:
|
Parâmetro |
Valor de exemplo |
Descrição |
|
|
|
Fuso horário utilizado pelo driver para converter valores TIMESTAMP no lado do cliente. O padrão é o fuso horário da JVM. |
|
|
|
Quando definido como |
Inclua ambos os parâmetros na string de conexão quando a aplicação for executada fora de UTC+8:
String url = "jdbc:mysql://ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com:33060/"
+ database
+ "?sslMode=disabled"
+ "&allowPublicKeyRetrieval=true"
+ "&useServerPrepStmts=true"
+ "&useLocalSessionState=true"
+ "&rewriteBatchedStatements=true"
+ "&cachePrepStmts=true"
+ "&prepStmtCacheSize=100"
+ "&prepStmtCacheSqlLimit=50000000"
+ "&forceConnectionTimeZoneToSession=true";
Properties properties = new Properties();
properties.put("user", username);
properties.put("password", password);
// Get a connection
Connection connection = DriverManager.getConnection(url, properties);
Python
Para instruções de conexão, consulte Use mysql-connector-python to develop applications.
Passe o parâmetro time_zone na chamada de conexão para definir o fuso horário da sessão no momento da conexão:
|
Parâmetro |
Valor de exemplo |
Descrição |
|
|
|
Define o fuso horário da sessão no servidor. Configure este valor com o fuso horário onde a aplicação está em execução. |
connection = mysql.connector.connect(
host='<LindormTable endpoint for MySQL>',
port=33060,
user='<Username>',
passwd='<Password>',
database='<Database name>',
time_zone='<Time zone>' # for example, 'UTC' or 'Asia/Tokyo'
)
Go
Para instruções de conexão, consulte Use Go to develop applications.
O Golang MySQL Driver transmite variáveis de sessão por meio da string de conexão. Valores do tipo string devem ser codificados em URL: envolva o valor entre aspas simples (') e codifique essas aspas como %27. Por exemplo, a string 'UTC' torna-se %27UTC%27.
|
Parâmetro |
Valor de exemplo |
Descrição |
|
|
|
Retorna valores DATE e TIMESTAMP como |
|
|
|
Fuso horário do Go usado ao analisar valores |
|
|
|
Define o fuso horário da sessão no servidor. O valor deve estar codificado em URL — aspas simples tornam-se |
Para mais informações sobre como o driver lida com variáveis de sistema, consulte System Variables.
urlString := fmt.Sprintf(
"%s:%s@tcp(%s:%d)/%s?timeout=%s&parseTime=true&loc=Local",
user, password, host, port, database, connectTimeout,
)
timeZoneValue := url.QueryEscape("'UTC'") // produces %27UTC%27
urlString = urlString + "&time_zone=" + timeZoneValue
db, err := sql.Open("mysql", urlString)
if err != nil {
panic(err.Error())
}
Próximos passos
Session variables — lista completa de variáveis no nível de sessão com suporte no LindormTable
Use the MySQL protocol to develop applications (recommended) — visão geral do suporte ao protocolo MySQL no LindormTable