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

如何在SQL Server中查找并处理C1控制字符\x80\x99

解决SQL Server中varchar列C1控制字符的查找与替换问题

核心问题原因

你遇到的是字节编码不匹配导致的查找失败:

  • 原文本的右单引号(’)被错误地以UTF-8编码(字节序列0xE2 0x80 0x99)存储到了varchar列中
  • SQL Server的varchar使用数据库默认代码页(如CP1252),char(0x80)对应CP1252的€,char(0x99)对应™,和你要找的字节完全不匹配
  • Python读取时把这三个UTF-8字节当成Latin1解码,就显示成了â\x80\x99,Notepad++则把这些字节解析成了C1控制符(PAD、SGCI)

步骤1:确认目标字符的实际字节值

先针对已知问题行(ID=1482786)提取可疑字符的字节码,验证具体值:

SELECT 
    SUBSTRING(AddressLine2, CHARINDEX('Tyler', AddressLine2) + 5, 3) AS 可疑字符片段,
    ASCII(SUBSTRING(AddressLine2, CHARINDEX('Tyler', AddressLine2) + 5, 1)) AS 字节1,
    ASCII(SUBSTRING(AddressLine2, CHARINDEX('Tyler', AddressLine2) + 6, 1)) AS 字节2,
    ASCII(SUBSTRING(AddressLine2, CHARINDEX('Tyler', AddressLine2) + 7, 1)) AS 字节3
FROM tablename
WHERE id = 1482786;

执行后会得到三个字节值,应该是226(0xE2)、128(0x80)、153(0x99)。

步骤2:查找所有包含错误字节的行

直接用对应的字节组合进行匹配,有两种方式:

方式1:使用CHAR()函数拼接字节

SELECT *
FROM tablename
WHERE AddressLine2 LIKE '%' + CHAR(226) + CHAR(128) + CHAR(153) + '%';

方式2:使用十六进制常量

SELECT *
FROM tablename
WHERE AddressLine2 LIKE '%' + 0xE28099 + '%';

步骤3:替换为正确的字符

如果需要把错误的字节序列替换成普通单引号('),执行:

UPDATE tablename
SET AddressLine2 = REPLACE(AddressLine2, CHAR(226) + CHAR(128) + CHAR(153), '''')
WHERE AddressLine2 LIKE '%' + CHAR(226) + CHAR(128) + CHAR(153) + '%';

如果需要保留正确的右单引号(’),可以先转换为nvarchar再替换:

UPDATE tablename
SET AddressLine2 = CONVERT(VARCHAR(MAX), REPLACE(CONVERT(NVARCHAR(MAX), AddressLine2 COLLATE SQL_Latin1_General_CP1_CI_AS), N'’', ''''))
WHERE AddressLine2 LIKE '%' + CHAR(226) + CHAR(128) + CHAR(153) + '%';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:04:59