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 / 100643
Accepted
Saeed Neamati
Saeed Neamati
Asked: 2015-05-06 02:03:24 +0800 CST2015-05-06 02:03:24 +0800 CST 2015-05-06 02:03:24 +0800 CST

Por que esses caracteres são todos iguais no SQL Server?

  • 772

Eu simplesmente não entendo. Veja esta consulta SQL:

select nchar(65217) -- ﻁ
select nchar(65218) -- ﻂ
select nchar(65219) -- ﻃ
select nchar(65220) -- ﻄ
if nchar(65217) = nchar(65218)
    print 'equal'
if nchar(65217) = nchar(65219)
    print 'equal'
if nchar(65217) = nchar(65220)
    print 'equal'

Com base na relação transitiva , significa que o SQL Server considera todos eles como o mesmo caractere.

No entanto, em outros ambientes, digamos, por exemplo, C#, eles não são os mesmos.

O que estou confuso é:

  1. Como funciona a comparação de strings no SQL Server
  2. Por que a comparação não se comporta da mesma forma em uma máquina e em uma plataforma, mas em ambientes diferentes
  3. Esses 4 caracteres representam um personagem compreensível para humanos. Por que eles são tão abundantes no mapa de caracteres Unicode?

É claro que isso resulta em problemas tremendos, porque estou trabalhando em um aplicativo de processamento de texto e os dados vêm de quase todos os lugares e preciso normalizar o texto antes de processá-lo.

Se eu souber o motivo da diferença, posso encontrar uma solução para lidar com isso. Obrigada.

sql-server unicode
  • 2 2 respostas
  • 3629 Views

2 respostas

  • Voted
  1. Best Answer
    Dan Guzman
    2015-05-07T04:01:32+08:002015-05-07T04:01:32+08:00

    Todos os dados de caracteres no SQL Server são associados a um agrupamento, que determina o domínio de caracteres que podem ser armazenados, bem como as regras usadas para comparar e classificar os dados. O agrupamento se aplica a dados Unicode e não Unicode.

    O SQL Server inclui 3 categorias amplas de agrupamentos: binário, herdado e Windows. Os agrupamentos na categoria binária ( _BINsufixo) usam os pontos de código subjacentes para comparar, de modo que as comparações de igualdade retornem diferentes se os pontos de código forem diferentes, independentemente do caractere. Os agrupamentos herdados ( SQL_prefixo) e do Windows fornecem semântica de classificação e comparação para as regras de dicionário mais naturais. Isso permite comparações para considerar maiúsculas e minúsculas, acentos, largura e Kana. Os agrupamentos do Windows fornecem regras mais robustas word-sortque se alinham estreitamente com o sistema operacional Windows, enquanto os agrupamentos herdados consideram apenas caracteres únicos.

    O exemplo abaixo ilustra as diferenças entre o Windows e o agrupamento binário com o caractere Teth:

    CREATE TABLE dbo.WindowsColationExample
        (
          Character1 nchar(1) COLLATE Arabic_100_CI_AS_SC
        , Character2 nchar(1) COLLATE Arabic_100_CI_AS_SC
        , Character3 nchar(1) COLLATE Arabic_100_CI_AS_SC
        , Character4 nchar(1) COLLATE Arabic_100_CI_AS_SC
        );
    
    CREATE TABLE dbo.BinaryColationExample
        (
          Character1 nchar(1) COLLATE Arabic_100_BIN
        , Character2 nchar(1) COLLATE Arabic_100_BIN
        , Character3 nchar(1) COLLATE Arabic_100_BIN
        , Character4 nchar(1) COLLATE Arabic_100_BIN
        );
    
    INSERT  INTO dbo.BinaryColationExample
    VALUES  ( NCHAR(65217), NCHAR(65218), NCHAR(65219), NCHAR(65220) );
    INSERT  INTO dbo.WindowsColationExample
    VALUES  ( NCHAR(65217), NCHAR(65218), NCHAR(65219), NCHAR(65220) );
    
    --all characters compare not equal
    SELECT *
    FROM dbo.BinaryColationExample
    WHERE
        character1 = character2
        OR character1 = character3
        OR character1 = character4
        OR character2 = character3
        OR character2 = character4
        OR character3 = character4;
    
    --all characters compare equal
    SELECT *
    FROM dbo.WindowsColationExample
    WHERE character1 = character2;
    SELECT *
    FROM dbo.WindowsColationExample
    WHERE character1 = character3;
    SELECT *
    FROM dbo.WindowsColationExample
    WHERE character1 = character4;
    SELECT *
    FROM dbo.WindowsColationExample
    WHERE character2 = character3;
    SELECT *
    FROM dbo.WindowsColationExample
    WHERE character2 = character4;
    SELECT *
    FROM dbo.WindowsColationExample
    WHERE character3 = character4;
    

    Os motivos pelos quais o Unicode pode conter diferentes pontos de código para glifos idênticos são descritos em http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode . Resumindo, pode ser para compatibilidade herdada ou os personagens não são canonicamente equivalentes. Observe que o caractere Teth ﻁé usado em diferentes idiomas ( http://en.wikipedia.org/wiki/Teth ).

    • 29
  2. Mark Sinkinson
    2015-05-06T02:34:52+08:002015-05-06T02:34:52+08:00

    Isso tem algo a ver com o COLLATIONseu banco de dados ( mais informações em BOL ).

    Não tenho certeza do idioma do caractere específico com o qual você está tendo problemas (suponho que persa com base neste tópico), mas se você especificar o agrupamento correto no operador de igualdade, obterá resultados precisos.

    if nchar(65217) COLLATE Persian_100_BIN = nchar(65218) COLLATE Persian_100_BIN 
        print 'equal'; -- nothing returned
    if nchar(65217)  COLLATE Persian_100_BIN  = nchar(65217)  COLLATE Persian_100_BIN 
        print 'equal'; -- prints 'equal'
    if nchar(65217) COLLATE Latin1_General_CI_AI = nchar(65220) COLLATE Latin1_General_CI_AI
        print 'equal'; -- prints 'equal'
    
    • 15

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