使用AWS Glue ETL写入MySQL时泰文显示为???的解决方法
解决AWS Glue ETL写入MySQL时泰文显示为'???'的问题
泰文显示乱码的核心原因是编码不匹配,需从MySQL目标端配置、Glue写入参数、作业环境编码三方面调整:
1. 修正MySQL目标表的字符集
MySQL的utf8实际是utf8mb3,仅支持基础Unicode字符,虽泰文大多在此范围内,但为确保兼容性,建议将目标表及列的字符集改为utf8mb4,并使用泰文专属排序规则:
-- 修改表字符集 ALTER TABLE your_target_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_thai_ci; -- 若需单独修改列 ALTER TABLE your_target_table MODIFY COLUMN thai_column VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_thai_ci;
2. 配置Glue写入MySQL的编码参数
你当前仅在读取时设置了charset,但写入环节的编码配置才是关键。需在JDBC连接参数中明确指定Unicode编码:
# 读取源数据(原读取配置可保留) dyf = glueContext.create_dynamic_frame.from_catalog( database="test", table_name="test", transformation_ctx="test_node", additional_options={"charset": "utf8"} ) # 写入MySQL的连接配置 write_options = { "url": "jdbc:mysql://your-mysql-host:3306/your_database?useUnicode=true&characterEncoding=utf8mb4", "dbtable": "your_target_table", "user": "your_db_user", "password": "your_db_password", "charset": "utf8mb4" } # 执行写入 glueContext.write_dynamic_frame.from_jdbc_conf( frame=dyf, catalog_connection="your_glue_jdbc_connection_name", # 替换为你的Glue JDBC连接名 connection_options=write_options, transformation_ctx="write_to_mysql" )
重点:URL中必须包含useUnicode=true&characterEncoding=utf8mb4,同时charset参数设为utf8mb4,确保Glue与MySQL之间的编码传输一致。
3. 确保Glue作业环境编码为UTF-8
在作业开头添加编码设置(Python 2需执行,Python 3可省略,但添加无影响):
import sys if sys.version_info[0] == 2: reload(sys) sys.setdefaultencoding('utf-8')
内容的提问来源于stack exchange,提问作者GIN
相关产品推荐
相关产品推荐

