You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取latin1编码多查询SQL脚本:空格与起始ASCII字符问题

问题解决:读取SQL脚本时的乱码与字符间隔问题

问题根源

你遇到的ÿþ前缀和字符间空格,本质是编码不匹配导致的:

  • ÿþ是UTF-16 LE编码的字节顺序标记(BOM),你的SQL脚本实际是UTF-16编码保存的,但你用单字节的latin1编码读取,导致BOM被解析成了两个乱码字符。
  • 字符间的空格是因为UTF-16每个字符占2字节,用latin1读取时会把每个字节单独解析成字符,其中的空字节(\x00)显示为空格。

解决方案

方案1:用正确编码读取文件

直接指定utf-16编码读取,Python会自动处理BOM,从根源解决乱码问题:

import os
str_sql_file= os.path.join(CONFIG.STR_ROOT_FOLDER, 'sql', CONFIG.STR_SQL_FILE_STEP_ONE)

# 使用utf-16编码读取,自动识别并移除BOM
with open(str_sql_file, 'r', encoding='utf-16') as file_sql_tmp:
    str_sql = file_sql_tmp.read()

方案2:手动清理BOM与乱码(适用于编码不确定的场景)

如果无法确定文件编码,可以先读取字节流,手动移除BOM后再转成正确字符串:

import os
str_sql_file= os.path.join(CONFIG.STR_ROOT_FOLDER, 'sql', CONFIG.STR_SQL_FILE_STEP_ONE)

with open(str_sql_file, 'rb') as file_sql_tmp:
    byte_content = file_sql_tmp.read()

# 移除UTF-16 LE的BOM(对应字节为0xFF 0xFE)
if byte_content.startswith(b'\xff\xfe'):
    byte_content = byte_content[2:]
# 解码为UTF-16字符串
str_sql = byte_content.decode('utf-16le')

进阶优化:安全拆分SQL语句

直接用分号拆分SQL存在风险(比如字符串或注释中包含分号),推荐用sqlparse库做专业拆分:

  1. 先安装库:
pip install sqlparse
  1. 拆分执行:
import sqlparse

# 智能拆分SQL语句,自动忽略注释、字符串中的分号
statements = sqlparse.split(str_sql)
for stmt in statements:
    # 跳过空语句
    if stmt.strip():
        print('executing sql: \n {}'.format(stmt))

内容的提问来源于stack exchange,提问作者Sade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:24:52