我正在尝试将数据库国际化,但是设置timestamp的地方是使用NOW()而不是UTC_TIMESTAMP(),而且它使用的是亚马逊的RDS和多个MySQL服务器。问题是,每个时区都在各自的时区上,这就造成了对各个时区的分离,将它们转换为UTC,然后再将它们重新翻译回用户时区。
这个数据库有一些140+表,我希望通过在每个表上使用SHOW CREATE来进行比手动搜索更高效的操作,另外,我希望能够在完成时检查是否所有内容都被正确转换。
对于这样的查询,有什么想法吗?
为了清楚起见,我正在寻找一个查询来SELECT我需要的行,我可以从中找出一个INSERT... SELECT语句。
发布于 2015-07-30 17:51:37
使用@a1ex07应答,我使用了以下查询:
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (table_schema, DATA_TYPE) = ('my_schema', 'timestamp') AND COLUMN_DEFAULT IS NOT NULL;这表明许多人使用的是CURRENT_TIMESTAMP而不是UTC_TIMESTAMP。
发布于 2015-08-01 00:04:31
我认为应该将NOW()存储到TIMESTAMP中。在存储时间时,根据时区修改时间,UTC存储在表中。检索时,执行反向修改。(当然,这假定系统建立了“正确的”时区。见SHOW VARIABLES LIKE '%zone%';.)
这样,如果您的用户分散在全球各地,列包含一个瞬间的时间,但每个用户看到它根据自己的时钟。也就是说,如果我将NOW()存储在时间戳中,而您(无论您在哪里)获取该字段,则它将是“立即”,并且看起来像您的时钟。
如果我把现在()存储在约会时间,你就会看到我的时钟是怎么写的。就像储存在VARCHAR里一样。
如果我将UTC_TIMESTAMP()存储到任意一种数据类型的字段中,那就太恶心了!
但是,多亏了云,你的处境更加混乱。也许在客户机中为会话设置time_zone可以解决这个问题。
或者也许UTC_TIMESTAMP()和DATETIME是答案。我认为这将避免云问题,但任何时候都将是UTC。
(大约有5种时间模式,而不仅仅是MySQL - conf调用时间提供的2种模式;另一时区的体育赛事、日历实现等)
每个连接时区。每个连接的客户端都有自己的时区设置,由会话time_zone变量提供。最初,会话变量从全局time_zone变量中获取其值,但是客户端可以使用以下语句更改自己的时区: mysql> SET time_zone = timezone;
-- http://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html
https://dba.stackexchange.com/questions/108572
复制相似问题