【问题标题】:Search and Replace Byte Order Mark In Sql Server在 Sql Server 中搜索和替换字节顺序标记
【发布时间】:2014-11-19 16:10:36
【问题描述】:

我有 10 个表和超过 10000 条记录,其中包含  如何搜索 并在数据库中替换它? 既然等于0xEF,0xBB,0xBF怎么能搜到这个?

我用这个代码

 WITH foo(myvarbincolumn) AS
(
SELECT text from BPM_Letters
)
SELECT *
FROM   foo
WHERE  CONVERT(VARCHAR(max), myvarbincolumn) COLLATE Arabic_CI_AS
                    LIKE '%' + CONVERT(NVARCHAR(max), CHAR(0xEF)+CHAR(0xBB)+CHAR(0xBF)) + '%' 

我在 stackoverflow 中找到了这段代码,但它不完整。

script of BPM_Letters 此代码找不到任何记录! 请帮帮我

【问题讨论】:

  • 您要搜索的表名是什么?提供的所有代码都是在一条记录的 CTE 中搜索相同的值(工作正常)。
  • 表名是'BPM_letters',列是'text'
  • 所以你想用0xEFBBBF替换
  • “文本”列的类型是什么?

标签: sql sql-server search encoding byte-order-mark


【解决方案1】:

我写了一个查询来通过下面的查询找到那个奇怪的字符:

SELECT cast(LEFT(text,1) AS VARBINARY(MAX)) from BPM_Letters  

结果是 0xFFFE。所以我写了这个查询,它工作得很好:

UPDATE BPM_Letters Set text=REPLACE(text,0xFFFE,'');

【讨论】:

    【解决方案2】:

    这个 CTE 怎么样:

    StripBOM AS
    (
       SELECT CASE
                 WHEN LEFT(text,3) = 0xEFBBBF
                    THEN CONVERT(varbinary(max),SUBSTRING(text, 4, LEN(text)))
                 ELSE text             
               END AS text
       FROM BPM_Letters
    )
    

    它应该为您提供一个新表,其中所有 BOM 字符都已被剥离。

    附:此代码假定“text”字段的类型为varbinary

    【讨论】:

    • 以及如何将替换为''?
    • @Seyed BOM 字节序列始终包含在开头。 SUBSTRING(text, 4, LEN(text)) 只是去掉这个字节序列。
    • 在 cmets @MISS 中说:类型文本是 nvarchar(MAX)。如何使用 nvarchar?
    • 感谢@GiorgosBetsos 您对获得第一个角色帮助的想法太多。
    【解决方案3】:

    这是一个基于其他答案的更简单的答案:

    UPDATE BPM_Letters SET text=substr(text, 4) WHERE left(text, 3) = 0xEFBBBF;
    

    我已经测试过了,它可以工作。

    【讨论】:

    • 这是两个字节,我不知道如何但我不适合我!
    猜你喜欢
    • 2012-04-22
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多