如何在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
相关产品推荐
相关产品推荐

