AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 138350
Accepted
Gerhard Weiss
Gerhard Weiss
Asked: 2016-05-13 05:49:32 +0800 CST2016-05-13 05:49:32 +0800 CST 2016-05-13 05:49:32 +0800 CST

Como verificar caracteres não ASCII

  • 772

Qual é a melhor maneira de verificar se um campo VARCHAR possui caracteres não ASCII?
CHAR(1)através CHAR(31)e CHAR(127)através CHAR(255).

Tentei usar PATINDEXe me deparei com o seguinte problema.

A verificação do intervalo inferior funcionou corretamente.

SELECT *      
FROM mbrnotes      
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0  

Meus dados tinham três registros com 0x1E e todos os três foram retornados.

Mas quando eu verifico apenas o intervalo superior:

SELECT *      
FROM mbrnotes      
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0 

Ele retorna perto de todos os registros da tabela (tabela contagem 170737 e retornou contagem 170735) e como meus dados não tinham nenhum valor nesse intervalo eu acho que não deveria ter retornado nenhum registro.

sql-server sql-server-2008-r2
  • 2 2 respostas
  • 62577 Views

2 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2016-05-13T06:11:00+08:002016-05-13T06:11:00+08:00

    Os intervalos na sintaxe do padrão usam as regras de classificação do seu agrupamento.

    Use uma cláusula de agrupamento binário para que o intervalo seja ordenado por código de caractere.

    (Eu também mudei para LIKEporque acho isso mais óbvio do que PATINDEX > 0)

    SELECT *
    FROM mbrnotes
    WHERE LINE_TEXT COLLATE Latin1_General_100_BIN2 
         LIKE '%[' + CHAR(0)+ '-' +CHAR(31) + CHAR(127)+ '-' +CHAR(255)+']%'  
    

    Se você realmente quiser ver os personagens ofensivos e estiver em uma versão com a TRANSLATEfunção, você pode usar algo como o abaixo

    DECLARE @WhiteListedCharacters NVARCHAR(1000)
    = ' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    + '[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
    
    SELECT text,
        REPLACE(
            TRANSLATE(
                text,
                @WhiteListedCharacters COLLATE Latin1_General_100_BIN2, 
                REPLICATE(
                    LEFT(@WhiteListedCharacters,1),
                    LEN(@WhiteListedCharacters))), 
            LEFT(@WhiteListedCharacters,1), 
            '') AS BadChars
    FROM   sys.messages
    WHERE  language_id = 1038 
    

    Você pode usar esse resultado em uma segunda chamada TRANSLATEpara preservar apenas os caracteres "bons".

    DECLARE @WhiteListedCharacters NVARCHAR(1000)
    = ' !"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    + '[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
    
    SELECT text,
        BadChars,
        Cleaned = REPLACE(
                      TRANSLATE(
                          text  COLLATE Latin1_General_100_BIN2,
                          BadChars,
                          REPLICATE(N'ψ', LEN(BadChars))
                          ),
                  N'ψ', N'')
    FROM sys.messages
    CROSS APPLY
    (
    SELECT REPLACE(
               TRANSLATE(
                   text,
                   @WhiteListedCharacters COLLATE Latin1_General_100_BIN2,
                   REPLICATE(
                       LEFT(@WhiteListedCharacters,1),
                       LEN(@WhiteListedCharacters + '-') - 1)),
                   LEFT(@WhiteListedCharacters,1), 
            '') AS BadChars
    ) ca
    WHERE language_id = 1038
    
    • 26
  2. John
    2018-12-14T08:00:09+08:002018-12-14T08:00:09+08:00

    Se você é como eu e se cansou ao longo dos anos procurando esses caracteres nos dados terríveis da sua empresa, você pode usar esta função ou reescrevê-la para seu próprio propósito. É reconhecidamente prolixo, mas dá um passo extra de identificar caracteres especiais, se você quiser - descomente as linhas 19 - 179 para fazê-lo.

    Se a string não contiver valores ASCII não imprimíveis ou estendidos - ela retornará NULL.

    CREATE FUNCTION [dbo].[Find_Invalid_Chars]
    (
        @SearchString VARCHAR(8000)
    )
    RETURNS VARCHAR(8000)
    AS
    BEGIN
        DECLARE @CharPosition INT, @CharVal VARCHAR(100), @ReturnVal VARCHAR(8000) = '', @isValid BIT = 1 -- Start as valid
    
        SET @CharPosition = 1
    
        WHILE @CharPosition <= DATALENGTH(@SearchString)
        BEGIN
        IF (ASCII(SUBSTRING(@SearchString, @CharPosition, 1)) NOT BETWEEN (32) AND (127))
            BEGIN
                SET @CharVal = '[' + CAST(ASCII(SUBSTRING(@SearchString, @CharPosition, 1)) AS VARCHAR(3)) + ']'
                SET @isValid = 0
                ---- Non-Printables
                --SET @CharVal = REPLACE(@CharVal, '[0]', '[NUL]')
                --SET @CharVal = REPLACE(@CharVal, '[1]', '[SOH]')
                --SET @CharVal = REPLACE(@CharVal, '[2]', '[STX]')
                --SET @CharVal = REPLACE(@CharVal, '[3]', '[ETX]')
                --SET @CharVal = REPLACE(@CharVal, '[4]', '[EOT]')
                --SET @CharVal = REPLACE(@CharVal, '[5]', '[ENQ]')
                --SET @CharVal = REPLACE(@CharVal, '[6]', '[ACK]')
                --SET @CharVal = REPLACE(@CharVal, '[7]', '[BEL]')
                --SET @CharVal = REPLACE(@CharVal, '[8]', '[BS]')
                --SET @CharVal = REPLACE(@CharVal, '[9]', '[HT]')
                --SET @CharVal = REPLACE(@CharVal, '[10]', '[LF]')
                --SET @CharVal = REPLACE(@CharVal, '[11]', '[VT]')
                --SET @CharVal = REPLACE(@CharVal, '[12]', '[FF]')
                --SET @CharVal = REPLACE(@CharVal, '[13]', '[CR]')
                --SET @CharVal = REPLACE(@CharVal, '[14]', '[SO]')
                --SET @CharVal = REPLACE(@CharVal, '[15]', '[SI]')
                --SET @CharVal = REPLACE(@CharVal, '[16]', '[DLE]')
                --SET @CharVal = REPLACE(@CharVal, '[17]', '[DC1]')
                --SET @CharVal = REPLACE(@CharVal, '[18]', '[DC2]')
                --SET @CharVal = REPLACE(@CharVal, '[19]', '[DC3]')
                --SET @CharVal = REPLACE(@CharVal, '[20]', '[DC4]')
                --SET @CharVal = REPLACE(@CharVal, '[21]', '[NAK]')
                --SET @CharVal = REPLACE(@CharVal, '[22]', '[SYN]')
                --SET @CharVal = REPLACE(@CharVal, '[23]', '[ETB]')
                --SET @CharVal = REPLACE(@CharVal, '[24]', '[CAN]')
                --SET @CharVal = REPLACE(@CharVal, '[25]', '[EM]')
                --SET @CharVal = REPLACE(@CharVal, '[26]', '[SUB]')
                --SET @CharVal = REPLACE(@CharVal, '[27]', '[ESC]')
                --SET @CharVal = REPLACE(@CharVal, '[28]', '[FS]')
                --SET @CharVal = REPLACE(@CharVal, '[29]', '[GS]')
                --SET @CharVal = REPLACE(@CharVal, '[30]', '[RS]')
                --SET @CharVal = REPLACE(@CharVal, '[31]', '[US]')
                ---- Extended Ascii
                --SET @CharVal = REPLACE(@CharVal, '[128]', '[€]')
                --SET @CharVal = REPLACE(@CharVal, '[129]', '[]]')
                --SET @CharVal = REPLACE(@CharVal, '[130]', '[‚]')
                --SET @CharVal = REPLACE(@CharVal, '[131]', '[ƒ]')
                --SET @CharVal = REPLACE(@CharVal, '[132]', '[„]')
                --SET @CharVal = REPLACE(@CharVal, '[133]', '[…]')
                --SET @CharVal = REPLACE(@CharVal, '[134]', '[†]')
                --SET @CharVal = REPLACE(@CharVal, '[135]', '[‡]')
                --SET @CharVal = REPLACE(@CharVal, '[136]', '[ˆ]')
                --SET @CharVal = REPLACE(@CharVal, '[137]', '[‰]')
                --SET @CharVal = REPLACE(@CharVal, '[138]', '[Š]')
                --SET @CharVal = REPLACE(@CharVal, '[139]', '[‹]')
                --SET @CharVal = REPLACE(@CharVal, '[140]', '[Œ]')
                --SET @CharVal = REPLACE(@CharVal, '[141]', '[]]')
                --SET @CharVal = REPLACE(@CharVal, '[142]', '[Ž]')
                --SET @CharVal = REPLACE(@CharVal, '[143]', '[]]')
                --SET @CharVal = REPLACE(@CharVal, '[144]', '[]]')
                --SET @CharVal = REPLACE(@CharVal, '[145]', '[‘]')
                --SET @CharVal = REPLACE(@CharVal, '[146]', '[’]')
                --SET @CharVal = REPLACE(@CharVal, '[147]', '[“]')
                --SET @CharVal = REPLACE(@CharVal, '[148]', '[”]')
                --SET @CharVal = REPLACE(@CharVal, '[149]', '[•]')
                --SET @CharVal = REPLACE(@CharVal, '[150]', '[–]')
                --SET @CharVal = REPLACE(@CharVal, '[151]', '[—]')
                --SET @CharVal = REPLACE(@CharVal, '[152]', '[˜]')
                --SET @CharVal = REPLACE(@CharVal, '[153]', '[™]')
                --SET @CharVal = REPLACE(@CharVal, '[154]', '[š]')
                --SET @CharVal = REPLACE(@CharVal, '[155]', '[›]')
                --SET @CharVal = REPLACE(@CharVal, '[156]', '[œ]')
                --SET @CharVal = REPLACE(@CharVal, '[157]', '[]]')
                --SET @CharVal = REPLACE(@CharVal, '[158]', '[ž]')
                --SET @CharVal = REPLACE(@CharVal, '[159]', '[Ÿ]')
                --SET @CharVal = REPLACE(@CharVal, '[160]', '[]]')
                --SET @CharVal = REPLACE(@CharVal, '[161]', '[¡]')
                --SET @CharVal = REPLACE(@CharVal, '[162]', '[¢]')
                --SET @CharVal = REPLACE(@CharVal, '[163]', '[£]')
                --SET @CharVal = REPLACE(@CharVal, '[164]', '[¤]')
                --SET @CharVal = REPLACE(@CharVal, '[165]', '[¥]')
                --SET @CharVal = REPLACE(@CharVal, '[166]', '[¦]')
                --SET @CharVal = REPLACE(@CharVal, '[167]', '[§]')
                --SET @CharVal = REPLACE(@CharVal, '[168]', '[¨]')
                --SET @CharVal = REPLACE(@CharVal, '[169]', '[©]')
                --SET @CharVal = REPLACE(@CharVal, '[170]', '[ª]')
                --SET @CharVal = REPLACE(@CharVal, '[171]', '[«]')
                --SET @CharVal = REPLACE(@CharVal, '[172]', '[¬]')
                --SET @CharVal = REPLACE(@CharVal, '[173]', '[]]')
                --SET @CharVal = REPLACE(@CharVal, '[174]', '[®]')
                --SET @CharVal = REPLACE(@CharVal, '[175]', '[¯]')
                --SET @CharVal = REPLACE(@CharVal, '[176]', '[°]')
                --SET @CharVal = REPLACE(@CharVal, '[177]', '[±]')
                --SET @CharVal = REPLACE(@CharVal, '[178]', '[²]')
                --SET @CharVal = REPLACE(@CharVal, '[179]', '[³]')
                --SET @CharVal = REPLACE(@CharVal, '[180]', '[´]')
                --SET @CharVal = REPLACE(@CharVal, '[181]', '[µ]')
                --SET @CharVal = REPLACE(@CharVal, '[182]', '[¶]')
                --SET @CharVal = REPLACE(@CharVal, '[183]', '[·]')
                --SET @CharVal = REPLACE(@CharVal, '[184]', '[¸]')
                --SET @CharVal = REPLACE(@CharVal, '[185]', '[¹]')
                --SET @CharVal = REPLACE(@CharVal, '[186]', '[º]')
                --SET @CharVal = REPLACE(@CharVal, '[187]', '[»]')
                --SET @CharVal = REPLACE(@CharVal, '[188]', '[¼]')
                --SET @CharVal = REPLACE(@CharVal, '[189]', '[½]')
                --SET @CharVal = REPLACE(@CharVal, '[190]', '[¾]')
                --SET @CharVal = REPLACE(@CharVal, '[191]', '[¿]')
                --SET @CharVal = REPLACE(@CharVal, '[192]', '[À]')
                --SET @CharVal = REPLACE(@CharVal, '[193]', '[Á]')
                --SET @CharVal = REPLACE(@CharVal, '[194]', '[Â]')
                --SET @CharVal = REPLACE(@CharVal, '[195]', '[Ã]')
                --SET @CharVal = REPLACE(@CharVal, '[196]', '[Ä]')
                --SET @CharVal = REPLACE(@CharVal, '[197]', '[Å]')
                --SET @CharVal = REPLACE(@CharVal, '[198]', '[Æ]')
                --SET @CharVal = REPLACE(@CharVal, '[199]', '[Ç]')
                --SET @CharVal = REPLACE(@CharVal, '[200]', '[È]')
                --SET @CharVal = REPLACE(@CharVal, '[201]', '[É]')
                --SET @CharVal = REPLACE(@CharVal, '[202]', '[Ê]')
                --SET @CharVal = REPLACE(@CharVal, '[203]', '[Ë]')
                --SET @CharVal = REPLACE(@CharVal, '[204]', '[Ì]')
                --SET @CharVal = REPLACE(@CharVal, '[205]', '[Í]')
                --SET @CharVal = REPLACE(@CharVal, '[206]', '[Î]')
                --SET @CharVal = REPLACE(@CharVal, '[207]', '[Ï]')
                --SET @CharVal = REPLACE(@CharVal, '[208]', '[Ð]')
                --SET @CharVal = REPLACE(@CharVal, '[209]', '[Ñ]')
                --SET @CharVal = REPLACE(@CharVal, '[210]', '[Ò]')
                --SET @CharVal = REPLACE(@CharVal, '[211]', '[Ó]')
                --SET @CharVal = REPLACE(@CharVal, '[212]', '[Ô]')
                --SET @CharVal = REPLACE(@CharVal, '[213]', '[Õ]')
                --SET @CharVal = REPLACE(@CharVal, '[214]', '[Ö]')
                --SET @CharVal = REPLACE(@CharVal, '[215]', '[×]')
                --SET @CharVal = REPLACE(@CharVal, '[216]', '[Ø]')
                --SET @CharVal = REPLACE(@CharVal, '[217]', '[Ù]')
                --SET @CharVal = REPLACE(@CharVal, '[218]', '[Ú]')
                --SET @CharVal = REPLACE(@CharVal, '[219]', '[Û]')
                --SET @CharVal = REPLACE(@CharVal, '[220]', '[Ü]')
                --SET @CharVal = REPLACE(@CharVal, '[221]', '[Ý]')
                --SET @CharVal = REPLACE(@CharVal, '[222]', '[Þ]')
                --SET @CharVal = REPLACE(@CharVal, '[223]', '[ß]')
                --SET @CharVal = REPLACE(@CharVal, '[224]', '[à]')
                --SET @CharVal = REPLACE(@CharVal, '[225]', '[á]')
                --SET @CharVal = REPLACE(@CharVal, '[226]', '[â]')
                --SET @CharVal = REPLACE(@CharVal, '[227]', '[ã]')
                --SET @CharVal = REPLACE(@CharVal, '[228]', '[ä]')
                --SET @CharVal = REPLACE(@CharVal, '[229]', '[å]')
                --SET @CharVal = REPLACE(@CharVal, '[230]', '[æ]')
                --SET @CharVal = REPLACE(@CharVal, '[231]', '[ç]')
                --SET @CharVal = REPLACE(@CharVal, '[232]', '[è]')
                --SET @CharVal = REPLACE(@CharVal, '[233]', '[é]')
                --SET @CharVal = REPLACE(@CharVal, '[234]', '[ê]')
                --SET @CharVal = REPLACE(@CharVal, '[235]', '[ë]')
                --SET @CharVal = REPLACE(@CharVal, '[236]', '[ì]')
                --SET @CharVal = REPLACE(@CharVal, '[237]', '[í]')
                --SET @CharVal = REPLACE(@CharVal, '[238]', '[î]')
                --SET @CharVal = REPLACE(@CharVal, '[239]', '[ï]')
                --SET @CharVal = REPLACE(@CharVal, '[240]', '[ð]')
                --SET @CharVal = REPLACE(@CharVal, '[241]', '[ñ]')
                --SET @CharVal = REPLACE(@CharVal, '[242]', '[ò]')
                --SET @CharVal = REPLACE(@CharVal, '[243]', '[ó]')
                --SET @CharVal = REPLACE(@CharVal, '[244]', '[ô]')
                --SET @CharVal = REPLACE(@CharVal, '[245]', '[õ]')
                --SET @CharVal = REPLACE(@CharVal, '[246]', '[ö]')
                --SET @CharVal = REPLACE(@CharVal, '[247]', '[÷]')
                --SET @CharVal = REPLACE(@CharVal, '[248]', '[ø]')
                --SET @CharVal = REPLACE(@CharVal, '[249]', '[ù]')
                --SET @CharVal = REPLACE(@CharVal, '[250]', '[ú]')
                --SET @CharVal = REPLACE(@CharVal, '[251]', '[û]')
                --SET @CharVal = REPLACE(@CharVal, '[252]', '[ü]')
                --SET @CharVal = REPLACE(@CharVal, '[253]', '[ý]')
                --SET @CharVal = REPLACE(@CharVal, '[254]', '[þ]')
                --SET @CharVal = REPLACE(@CharVal, '[255]', '[ÿ]')
            END
        ELSE
            BEGIN
                SET @CharVal = SUBSTRING(@SearchString, @CharPosition, 1)
            END
    
        SET @ReturnVal = @ReturnVal + @CharVal
    
        SET @CharPosition = @CharPosition + 1
        END
    
    IF (@isValid = 1) SET @ReturnVal = NULL
    
    RETURN @ReturnVal
    
    END
    

    E então, chame assim:

    SELECT BadString, dbo.Find_Invalid_Chars(BadString) [Invalid Characters]
    FROM #tmp_Table tmp_mc
    WHERE dbo.Find_Invalid_Chars(BadString) IS NOT NULL
    

    Saída de amostra:

    Com Identidade Char

    Ou

    Sem Identidade Char

    • 8

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve