【问题标题】:Sql Server - Remove End String Character "\0" From DataSql Server - 从数据中删除结束字符串字符“\0”
【发布时间】:2010-08-20 17:26:23
【问题描述】:

我在数据库 (SQL Server 2005) 中有一个列,其数据末尾带有“\0”。在 SQL Server 中查询时,此字符不可见,并且“似乎”不存在。当我查看我的 C# 代码时,字符就在那里。此字符导致我们的网站出现错误,我们需要将其从所有受影响的行中删除。

是否有我可以编写的 sql 查询来轻松地从所有受影响的记录中删除此字符?我可以获得所有受影响的记录,但我没有办法将记录更新为新值(没有“\0”)。

更新: 这似乎有效:

Select * from TABLE
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0

所以:

Update TABLE
SET naughtyField = SUBSTRING(naughtyField, 1, LEN(naughtyField) - 1)
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0

【问题讨论】:

  • 那么,我该怎么做呢?威尔的回答不正确,但他的帮助使我找到了解决方案。
  • 如果 Will 将他关于使用 SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) 的评论移到他应该解决问题的答案中?
  • 是的......虽然你的答案更优雅,但我认为我不能仅仅为了这个“快速修复”而在 Prod 数据库上创建一个函数。文书工作太多。

标签: sql sql-server database sql-server-2005


【解决方案1】:

更新 tbl SET col = REPLACE(col,char(0),'')

编辑:只是为了赎回这个答案!对于字符串嵌入\0s 的更一般情况可能有用。

CREATE FUNCTION dbo.RemoveNullChars 
(
    @string NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX) WITH RETURNS NULL ON NULL INPUT
AS
BEGIN
DECLARE @Result NVARCHAR(MAX)
SET @Result = ''

DECLARE @counter INT

SET @counter = 0

WHILE (@counter <= LEN(@string))
    BEGIN
     IF UNICODE(SUBSTRING(@string,@counter,1)) <>  0 
        SET @Result = @Result + SUBSTRING(@string,@counter,1)
    SET @counter = @counter + 1    
    END
RETURN @Result
END

然后

 UPDATE tbl SET col = dbo.RemoveNullChars (col)

【讨论】:

    【解决方案2】:

    是否...

    UPDATE mytable
    SET myfield = REPLACE(myfield, CHAR(0), '')
    

    ...工作?

    SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) 在那些以 null 终止的字段上有效 - 但请注意不要在非 NULL 终止的字符串上使用它,否则您将丢失数据。

    【讨论】:

    • 没有。从我的快速测试。 create table #t (col varchar(50)) insert into #t values ('hgjh' + char(0) + 'gghg' ) UPDATE #t SET col = REPLACE(col,char(0),'')
    • LEN(naughtyfield) 是否返回包含 MSSQL 中的空终止符的长度?
    • 是的,Len('列中的字符串') = X, Len(naughtyfield) = X + 1
    • 在那些以 null 结尾的字段上使用 SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) - 这很有效。
    • 我不确定所有字段都会有它,所以我可能会切断好的数据
    【解决方案3】:

    我最近遇到了这个问题并修复了它。它似乎总是在字符串的末尾(因为它是一个终止符)。

    此外,由于它不是空格,它会导致 rtrim 无法处理具有额外尾随空格的字段(例如 'California             \0')。

    删除它的最安全方法是从 (0) 到('\0' 的最后一个索引或字符串长度,如果 '\0' 未找到)的子字符串

    这是我在我的情况下安全移除它的方法

        substring([field], 0, ( LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1 ) )
    

    这里是删除它并修剪多余的空格。

        ltrim(rtrim(substring([field], 0, ( LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1 ) ) ))
    

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2017-04-25
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多