Azure Synapse中Parquet数据表情符号显示异常解决方案咨询
解决Azure Synapse中Parquet表情符号显示异常的建议
1. 确认列数据类型与编码匹配
- 先检查Synapse表中存储表情符号的列类型:必须用
nvarchar(max)(原生支持Unicode),如果用了varchar类型,大概率会因为编码不兼容导致表情符号变成??或乱码。 - 虽然Parquet文件本身默认是UTF-8编码(在线查看器能正常显示也验证了这点),但Synapse读取时如果列类型不对,会直接破坏字符解析。
2. 切换到UTF-8兼容的排序规则
- 如果表的排序规则是旧版非UTF-8类型(比如
SQL_Latin1_General_CP1_CI_AS),会无法识别Unicode补充平面的表情符号。可以修改列的排序规则,执行以下SQL:
ALTER TABLE [你的表名] ALTER COLUMN [表情列名] NVARCHAR(MAX) COLLATE Latin1_General_100_CI_AS_SC_UTF8;
- 新建表时直接指定UTF-8排序规则:
CREATE TABLE [新表名] ( [表情列名] NVARCHAR(MAX) COLLATE Latin1_General_100_CI_AS_SC_UTF8 );
3. 修正外部表的文件格式配置
- 如果是通过外部表读取Parquet,确保外部文件格式显式指定UTF-8编码:
CREATE EXTERNAL FILE FORMAT Parquet_UTF8 WITH ( FORMAT_TYPE = PARQUET, DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec', ENCODING = 'UTF8' );
- 绑定这个文件格式到外部数据源,避免Synapse读取时默认使用非UTF-8编码解析。
4. 检查查询工具的显示支持
- 确认你用的Synapse查询工具(比如Synapse Studio编辑器、Azure Data Studio)是最新版本,旧版本可能对表情符号这类Unicode特殊字符支持不足。
- 如果用SSMS连接Synapse,确保版本在18.0以上,并且在工具选项里开启了Unicode字符显示。
5. Spark读写的端到端编码控制
- 如果是通过Spark池读写数据,读取Parquet时默认用UTF-8,但写入SQL池时要明确指定映射到
nvarchar类型,同时设置字符集为UTF-8:
df = spark.read.parquet("abfss://容器名@存储账户.dfs.core.windows.net/parquet文件路径") df.write.format("jdbc") \ .option("url", "jdbc:sqlserver://你的Synapse工作区.sql.azuresynapse.net:1433;database=你的库") \ .option("dbtable", "你的表") \ .option("user", "用户名") \ .option("password", "密码") \ .option("charset", "UTF-8") \ .save()
内容的提问来源于stack exchange,提问作者Rishi
相关产品推荐
相关产品推荐

