【问题标题】:How to search in SQL Server for text that has special characters?如何在 SQL Server 中搜索具有特殊字符的文本?
【发布时间】:2022-01-13 05:18:44
【问题描述】:

我有一个 SQL Server 表,其中有一列类型为 TEXT 的列,可以存储不同格式的候选人简历。 RTF 是最常见的一种,但我们经常从 3rd 方转换器获取简历数据,该转换器将简历存储为特殊字符(可能是 Unicode 或我不知道它们是什么)。

  1. 如何搜索我的表以找到所有包含这些特殊字符的行?例如id = 4,6,7,9等的行都是带有特殊字符的记录。

  2. 这些特殊字符叫什么格式?统一码??

【问题讨论】:

  • 根据您对“特殊”字符的定义,您可能会发现 this SO accepted answer 很有帮助。
  • ntexttext 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)See details here
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 特殊字符是否出现在普通的 RTF 文档中?如果没有,搜索RESUME_TEXT不是以{\rtf1开头的记录不是更容易吗?
  • 首先尝试看看这些字符是什么,您可能会这样做:` select cast(left(cast(resume_text as varchar(max)),20) as varbinary(max))` 用于示例行。如果您使用 SSMS,这应该显示为一串十六进制字符(0x 后面的每一对都是一个字节;其中一个或多个代表一个字符,它们代表什么字符取决于编码;我们可以尝试使用ASCII/Unicode 表。但他们可能刚刚上传了一个 PDF 文档,例如;然后字节不是编码字符。

标签: sql sql-server unicode encoding character-encoding


【解决方案1】:

假设您所说的“特殊”字符是指可打印 ASCII 和某些常见空白字符集之外的任何内容,您可以尝试以下操作:

DECLARE @SpecialPattern VARCHAR(100) =
    '%[^'
    + CHAR(9) + CHAR(10) + CHAR(13) -- tab, CR, LF
    + CHAR(32) + '-' + CHAR(126) -- Range from space to last printable ASCII
    + ']%'

SELECT
    RESUME_TEXT,
    cast(left(cast(resume_text as varchar(max)),20) as varbinary(max))` -- Borrowed from userMT's comment
FROM RESUME
WHERE RESUME_TEXT LIKE @SpecialPattern COLLATE Latin1_General_Bin -- Use exact compare

对于文本中可能存在的一些完全有效的扩展字符,例如重音元音、弯引号或 m- 和 n- 破折号,您可能会得到一些错误的命中。

我的第一个问题是奇怪的字符可能是 UTF-8 BOM(十六进制 EF、BB、BF),但显示似乎与我期望 SQL Server 呈现它们的方式不匹配。默认 Windows 代码页 (1252) 中根本不存在反圆点。

我们至少需要一些十六进制数据(至少前几个字节)来进一步提供帮助。通常,常见的二进制文件类型在前 3-5 个字节中具有可识别的签名。

【讨论】:

  • 勘误表:我在上面添加了 COLLATE Latin1_General_Bin 以强制进行精确的代码序列比较
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
相关资源
最近更新 更多