Redshift数据库UTC转IST失败:pg_timezone系列函数报错求助
解决Redshift中pg_timezone函数报错及UTC转IST的问题
问题根源
你遇到的报错是因为数据库字符集为SQL_ASCII,而pg_timezone_names()和pg_timezone_abbrevs()返回的时区名称包含非ASCII字符(比如带特殊符号的时区名),SQL_ASCII无法解析这些字符,导致报错,进而影响依赖时区信息的convert_timezone()函数。
快速满足UTC转IST需求(绕开报错)
不用依赖出问题的pg_timezone函数,直接用明确的时区偏移或IANA标准时区ID调用convert_timezone()即可完成转换:
方法1:用时区偏移(IST为UTC+5:30)
SELECT convert_timezone('UTC', '+05:30', your_utc_timestamp_column) AS ist_timestamp FROM your_table;
方法2:用IANA时区ID(Asia/Kolkata对应印度标准时间)
SELECT convert_timezone('UTC', 'Asia/Kolkata', your_utc_timestamp_column) AS ist_timestamp FROM your_table;
这两种方法不需要查询pg_timezone相关表,完全避开字符集导致的报错,直接实现UTC到IST的转换。
彻底解决字符集问题
如果要彻底解决pg_timezone函数的报错,需要将数据库字符集切换为UTF-8(Redshift官方推荐,支持所有Unicode字符),步骤如下:
- 创建新的UTF-8编码数据库
CREATE DATABASE your_new_database WITH ENCODING 'UTF8';
- 迁移现有数据库的表结构、数据到新库:
- 可以用Redshift的
UNLOAD导出数据,再用COPY导入新库 - 或者通过SQL Workbench的导出/导入工具迁移
- 复杂场景可用AWS DMS(数据库迁移服务)
- 可以用Redshift的
- 在新库中测试
pg_timezone_names()、pg_timezone_abbrevs()和convert_timezone()函数,确认正常工作
注意事项
SQL_ASCII字符集仅支持ASCII范围内的字符,不适合存储包含非ASCII内容的数据或系统元数据(如时区名),Redshift现在默认推荐使用UTF8- 若暂时无法迁移数据库,优先使用前面的快速转换方法满足业务需求
内容的提问来源于stack exchange,提问作者Mahui
相关产品推荐
相关产品推荐

