복붙노트

[SQL] 어떻게 SQL Server 2005의 테이블에 NTEXT 필드에 유니 코드 / 비 ASCII 문자를 찾을 수 있습니까?

SQL

어떻게 SQL Server 2005의 테이블에 NTEXT 필드에 유니 코드 / 비 ASCII 문자를 찾을 수 있습니까?

나는 몇 천 행이있는 테이블이있다. 설명 및 요약 필드는 NTEXT, 그리고 때로는 그들에 비 ASCII 문자가 있습니다. 어떻게 비 ASCII 문자가 포함 된 모든 행을 찾을 수 있습니까?

해결법

  1. ==============================

    1.가끔 "이상한"문자를 찾으려면이 "캐스팅"문을 사용하고있다

    가끔 "이상한"문자를 찾으려면이 "캐스팅"문을 사용하고있다

    select 
        *
    from 
        <Table>
    where 
        <Field> != cast(<Field> as varchar(1000))
    
  2. ==============================

    2.이스케이프 절에서 사용하기에 나중에 | 각각의 문자로 시작된다 - 먼저 빌드 당신이에 관심이있는 모든 문자와 문자열 (제어 문자가없는 0x7F의 범위, 또는 7 비트의 예는가 0x20를 사용합니다.).

    이스케이프 절에서 사용하기에 나중에 | 각각의 문자로 시작된다 - 먼저 빌드 당신이에 관심이있는 모든 문자와 문자열 (제어 문자가없는 0x7F의 범위, 또는 7 비트의 예는가 0x20를 사용합니다.).

    -- Start with tab, line feed, carriage return
    declare @str varchar(1024)
    set @str = '|' + char(9) + '|' + char(10) + '|' + char(13)
    
    -- Add all normal ASCII characters (32 -> 127)
    declare @i int
    set @i = 32
    while @i <= 127
        begin
        -- Uses | to escape, could be any character
        set @str = @str + '|' + char(@i)
        set @i = @i + 1
        end
    

    다음 목록에없는 모든 문자에 대한 검색을 니펫을. 이 %는 0 개 이상의 문자와 일치합니다. 에서 [] 안에 문자 중 하나와 일치하는 [], A, B 또는 C 중 어느 하나와 일치하는 것, 예 [ABC] 대. ^를을 Negate 목록, 예를 들어 [^ ABC] A, B 또는 C 아니다 아무것도 일치합니다.

    select *
    from yourtable
    where yourfield like '%[^' + @str + ']%' escape '|'
    

    그렇지 않으면, % 또는 같은 문자를 검색하기 때문에 이스케이프 문자가 필요합니다 _ 것 엉망에서 LIKE 표현까지.

    이 유용하고, 덕분에 다른 대답에 JohnFX의 의견을 바랍니다.

  3. ==============================

    3.나중에 여기 요 :

    나중에 여기 요 :

    SELECT *
    FROM Objects
    WHERE 
        ObjectKey LIKE '%[^0-9a-zA-Z !"#$%&''()*+,\-./:;<=>?@\[\^_`{|}~\]\\]%' ESCAPE '\'
    
  4. ==============================

    4.기술적으로, 내가 NCHAR (1) 유효한 ASCII 문자라고 생각 IF 및 경우에만 유니 코드 (@NChar) <256 ASCII (@NChar) = 유니 코드 (@NChar) 그 의도 정확히 무엇을하지 않을 수 있지만. 따라서이 올바른 해결책이 될 것입니다 :

    기술적으로, 내가 NCHAR (1) 유효한 ASCII 문자라고 생각 IF 및 경우에만 유니 코드 (@NChar) <256 ASCII (@NChar) = 유니 코드 (@NChar) 그 의도 정확히 무엇을하지 않을 수 있지만. 따라서이 올바른 해결책이 될 것입니다 :

    ;With cteNumbers as
    (
        Select ROW_NUMBER() Over(Order By c1.object_id) as N
        From sys.system_columns c1, sys.system_columns c2
    )
    Select Distinct RowID
    From YourTable t
        Join cteNumbers n ON n <= Len(CAST(TXT As NVarchar(MAX)))
    Where UNICODE(Substring(TXT, n.N, 1)) > 255
        OR UNICODE(Substring(TXT, n.N, 1)) <> ASCII(Substring(TXT, n.N, 1))
    

    이것은 또한 매우 빠른해야한다.

  5. ==============================

    5.그것은 아마 최고의 솔루션,하지만 어쩌면 쿼리 같은이 아니다 :

    그것은 아마 최고의 솔루션,하지만 어쩌면 쿼리 같은이 아니다 :

    SELECT *
    FROM yourTable
    WHERE yourTable.yourColumn LIKE '%[^0-9a-zA-Z]%'
    

    뭔가로 "0-9A-ZA-Z"식을 교체하는 캡처 전체 ASCII 세트 (또는 데이터에 포함 된 일부).

  6. ==============================

    6.나는 CC1960의 솔루션 @ 시작하지만 실패의 원인이 흥미로운 사용 사례를 발견했다. SQL 서버가 유니 코드를 지원하지 않는 근사치에 특정 유니 코드 문자를 동일시 것으로 보인다. WHERE 절에서 비교 예를 들어, SQL Server는 유니 코드 문자 "전각 쉼표"(http://www.fileformat.info/info/unicode/char/ff0c/index.htm) 표준 ASCII 쉼표와 같은 생각한다.

    나는 CC1960의 솔루션 @ 시작하지만 실패의 원인이 흥미로운 사용 사례를 발견했다. SQL 서버가 유니 코드를 지원하지 않는 근사치에 특정 유니 코드 문자를 동일시 것으로 보인다. WHERE 절에서 비교 예를 들어, SQL Server는 유니 코드 문자 "전각 쉼표"(http://www.fileformat.info/info/unicode/char/ff0c/index.htm) 표준 ASCII 쉼표와 같은 생각한다.

    이 문제를 해결하기 위해, SQL 서버는 바이너리로 문자열을 비교합니다. 하지만 기억, NVARCHAR와 VARCHAR 바이너리는 최대 (16 비트 8 비트 대)과 일치하지 않는, 다시 바이너리 비교를 수행하기 전에 NVARCHAR로 VARCHAR의 백업을 변환 할 필요가 있도록 :

    select *
    from my_table
    where CONVERT(binary(5000),my_table.my_column) != CONVERT(binary(5000),CONVERT(nvarchar(1000),CONVERT(varchar(1000),my_table.my_column)))
    
  7. ==============================

    7.특정 유니 코드 문자를 찾고 있다면, 당신은 다음과 같은 것을 사용할 수 있습니다.

    특정 유니 코드 문자를 찾고 있다면, 당신은 다음과 같은 것을 사용할 수 있습니다.

       select  Fieldname from 
         (
          select Fieldname,
                 REPLACE(Fieldname COLLATE Latin1_General_BIN,
                 NCHAR(65533) COLLATE Latin1_General_BIN,
                 'CustomText123') replacedcol
          from table
         ) results where results.replacedcol like '%CustomText123%'
    
  8. ==============================

    8.내 이전의 대답은 유니 코드 / 비 유니 코드 데이터를 혼동했다. 여기에 내가 여전히 이상 실행 해요 있지만, 모든 상황에서 작동해야 솔루션입니다. 첨자 문자에 대한 특정 비 ASCII 유니 코드 문자는 실제 번호 문자와 혼동되고있는 것 같다. 당신은 그것을 해결하기 위해 정렬 함께 놀러 할 수 있습니다.

    내 이전의 대답은 유니 코드 / 비 유니 코드 데이터를 혼동했다. 여기에 내가 여전히 이상 실행 해요 있지만, 모든 상황에서 작동해야 솔루션입니다. 첨자 문자에 대한 특정 비 ASCII 유니 코드 문자는 실제 번호 문자와 혼동되고있는 것 같다. 당신은 그것을 해결하기 위해 정렬 함께 놀러 할 수 있습니다.

    희망 당신은 이미 (그들은 매우 유용 할 수 있습니다) 데이터베이스의 번호 테이블을 가지고 있지만, 부분적으로 그뿐만 아니라 채우기에 대비해서 내가 코드를 포함 시켰습니다.

    유니 코드 문자가 255을 넘어 갈 수 있기 때문에 또한, 숫자 범위 함께 놀러해야 할 수도 있습니다.

    CREATE TABLE dbo.Numbers
    (
        number  INT NOT NULL,
        CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (number)
    )
    GO
    DECLARE @i INT
    
    SET @i = 0
    
    WHILE @i < 1000
    BEGIN
        INSERT INTO dbo.Numbers (number) VALUES (@i)
    
        SET @i = @i + 1
    END
    GO
    
    SELECT *,
        T.ID, N.number, N'%' + NCHAR(N.number) + N'%'
    FROM
        dbo.Numbers N
    INNER JOIN dbo.My_Table T ON
        T.description LIKE N'%' + NCHAR(N.number) + N'%' OR
        T.summary LIKE N'%' + NCHAR(N.number) + N'%'
    and t.id = 1
    WHERE
        N.number BETWEEN 127 AND 255
    ORDER BY
        T.id, N.number
    GO
    
  9. ==============================

    9.-이 그 일을 매우, 매우 비효율적 인 방법은 있지만에 대한 확인을해야한다 - 작은 테이블. 그것은 Itzik 벤 웨이 코 뮤니시 당 단순히 숫자의 보조 테이블을 사용 - 비트 7 세트의 문자를 찾습니다.

    -이 그 일을 매우, 매우 비효율적 인 방법은 있지만에 대한 확인을해야한다 - 작은 테이블. 그것은 Itzik 벤 웨이 코 뮤니시 당 단순히 숫자의 보조 테이블을 사용 - 비트 7 세트의 문자를 찾습니다.

    SELECT  *
    FROM    yourTable as t
    WHERE   EXISTS ( SELECT *
                     FROM   msdb..Nums as NaturalNumbers
                     WHERE  NaturalNumbers.n < LEN(t.string_column)
                            AND ASCII(SUBSTRING(t.string_column, NaturalNumbers.n, 1)) > 127)  
    
  10. from https://stackoverflow.com/questions/686967/how-can-i-find-unicode-non-ascii-characters-in-an-ntext-field-in-a-sql-server-20 by cc-by-sa and MIT license