[SQL] 어떻게 SQL Server 2005의 테이블에 NTEXT 필드에 유니 코드 / 비 ASCII 문자를 찾을 수 있습니까?
SQL어떻게 SQL Server 2005의 테이블에 NTEXT 필드에 유니 코드 / 비 ASCII 문자를 찾을 수 있습니까?
나는 몇 천 행이있는 테이블이있다. 설명 및 요약 필드는 NTEXT, 그리고 때로는 그들에 비 ASCII 문자가 있습니다. 어떻게 비 ASCII 문자가 포함 된 모든 행을 찾을 수 있습니까?
해결법
-
==============================
1.가끔 "이상한"문자를 찾으려면이 "캐스팅"문을 사용하고있다
가끔 "이상한"문자를 찾으려면이 "캐스팅"문을 사용하고있다
select * from <Table> where <Field> != cast(<Field> as varchar(1000))
-
==============================
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.나중에 여기 요 :
나중에 여기 요 :
SELECT * FROM Objects WHERE ObjectKey LIKE '%[^0-9a-zA-Z !"#$%&''()*+,\-./:;<=>?@\[\^_`{|}~\]\\]%' ESCAPE '\'
-
==============================
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.그것은 아마 최고의 솔루션,하지만 어쩌면 쿼리 같은이 아니다 :
그것은 아마 최고의 솔루션,하지만 어쩌면 쿼리 같은이 아니다 :
SELECT * FROM yourTable WHERE yourTable.yourColumn LIKE '%[^0-9a-zA-Z]%'
뭔가로 "0-9A-ZA-Z"식을 교체하는 캡처 전체 ASCII 세트 (또는 데이터에 포함 된 일부).
-
==============================
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.특정 유니 코드 문자를 찾고 있다면, 당신은 다음과 같은 것을 사용할 수 있습니다.
특정 유니 코드 문자를 찾고 있다면, 당신은 다음과 같은 것을 사용할 수 있습니다.
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.내 이전의 대답은 유니 코드 / 비 유니 코드 데이터를 혼동했다. 여기에 내가 여전히 이상 실행 해요 있지만, 모든 상황에서 작동해야 솔루션입니다. 첨자 문자에 대한 특정 비 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.-이 그 일을 매우, 매우 비효율적 인 방법은 있지만에 대한 확인을해야한다 - 작은 테이블. 그것은 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)
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
'SQL' 카테고리의 다른 글
[SQL] CSV에서 SQL 대량 가져 오기 (0) | 2020.06.05 |
---|---|
[SQL] 행에서 최대 값을 얻기과 다른 테이블에 합류 (0) | 2020.06.05 |
[SQL] 우리는 다른 테이블의 기본 키가 아닌 외부 키를 가질 수있다? (0) | 2020.06.05 |
[SQL] SQL 서버 내에서 와일드 카드를 사용하여 (0) | 2020.06.05 |
[SQL] 어떤 SQL 문은 빠르다? (대 WHERE 음 ...) (0) | 2020.06.05 |