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 / 298499
Accepted
QFirstLast
QFirstLast
Asked: 2021-08-25 10:59:13 +0800 CST2021-08-25 10:59:13 +0800 CST 2021-08-25 10:59:13 +0800 CST

Por que uma comparação entre 'tr' e 'tR' falha em um SQL Server com agrupamento Vietnamese_CI_AI?

  • 772

Parece haver algo especial sobre 'tR' no agrupamento vietnamita. Appreicate se alguém que sabe sobre isso pode explicar em termos simples. Esse problema foi descoberto durante a instalação do nosso produto em um SQL Server agrupado "vietnamita". Uma das tabelas no esquema tem 'tR' em seu nome, mas um procedimento armazenado está referenciando a tabela em todas as letras minúsculas 'tr'. E esta referência falha.

Acho que essa situação é análoga a '阝' combinando 'ss' em outros agrupamentos.

Aqui está uma reprodução:

select  case when 'tr' = 'tR' COLLATE SQL_Latin1_General_CP1_CI_AS   then 'match' else 'no match' end 
select  case when 'tr' = 'tR' COLLATE Vietnamese_CI_AI   then 'match' else 'no match' end 
select  case when 'tr' = 'TR' COLLATE Vietnamese_CI_AI   then 'match' else 'no match' end 

Resultados:

-----
match


--------
no match


-----
match

O segundo T-SQL produz a incompatibilidade. Outras combinações de 't' e 'R' não.

sql-server collation
  • 1 1 respostas
  • 1087 Views

1 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2021-08-25T11:25:18+08:002021-08-25T11:25:18+08:00

    Dado que esse comportamento está presente na versão mais recente desse agrupamento e que combinações como "fr" e "fR" correspondem (como esperado), só podem ser regras linguísticas específicas da cultura para essa combinação de caracteres.

    SELECT CASE WHEN 'tr' = 'tR' COLLATE Vietnamese_100_CI_AI THEN 'Y' ELSE 'N' END;
    -- N
    
    SELECT CASE WHEN 'fr' = 'fR' COLLATE Vietnamese_100_CI_AI THEN 'Y' ELSE 'N' END;
    -- Y
    

    Encontrei a regra no arquivo de peso de classificação ** . É a combinação de "tr" que é especial (em vietnamita), não "tR". Parece que o vietnamita tem certas combinações de letras que se combinam para formar um único caractere, como as combinações "CH" e "LL" em espanhol. Portanto, as seguintes combinações são válidas para o "caracter" que "T" + "R" se combinam para formar em vietnamita:

    1. tr
    2. Tr
    3. TR

    A combinação de "tR" não forma o caractere "TR", provavelmente porque essa é uma capitalização não natural que mais implica separação de palavras, como com Pascal / Camel -casing (por exemplo, "Cha tR oom" e "cha tR oom", respectivamente, em oposição a " tR ogdor the Burninator ") (adivinhação educada de minha parte) .

    O exemplo a seguir mostra que a combinação "tr" classifica após "tz":

    SELECT *
    FROM   (VALUES (N'Atra'), (N'Atz'), (N'Aua'), (N'Ata'), (N'AtR')) tmp(col)
    ORDER BY tmp.[col] COLLATE Vietnamese_100_CI_AI ASC
    /*
    Ata
    AtR
    Atz
    Atra
    Aua
    */
    

    Esses resultados são devidos à combinação de "tr" para formar um único caractere que classifica naturalmente após "t". Ou seja, o algoritmo de classificação vê o seguinte:

     Character #
    1  |  2   | 3
    -------------
    A  |  t   | a
    A  |  t   | R
    A  |  t   | z
    A  |  tr  | a
    A  |  u   | a
    

    Vietnamita tem outras combinações de duas letras que funcionam da mesma forma que "TR" (ou seja, não diferencia maiúsculas de minúsculas: tr == Tr == TR <> tR):

    1. CH
    2. GI
    3. KH
    4. NG
    5. NH
    6. PH
    7. QU
    8. º

    Para obter mais informações sobre como trabalhar com agrupamentos / codificações / Unicode, visite meu site: Informações de agrupamentos


    ** Um arquivo de peso de classificação contém pontos de código e seus respectivos valores de peso que são separados em categorias, como peso diacrítico, peso de caso etc. Geralmente, há seções que descrevem transformações, como combinar dois pontos de código para ser um único peso para um determinada cultura/localidade (por exemplo, vietnamita). Pode haver mapeamentos para decompor caracteres pré-compostos em caracteres individuais, etc. Consulte: Acessando a Tabela de Peso de Classificação do Windows .

    NOTA: A Microsoft fornece vários arquivos de peso de classificação, pois eles foram atualizados ao longo dos anos à medida que novas versões do Windows e do Windows Server foram lançadas. Lembre-se de que nenhum desses arquivos corresponde 100% às regras que o SQL Server usa. O mais próximo que chegamos é o arquivo Tabela de Peso de Classificação do Windows Server 2008.txt , que deve corresponder ao comportamento dos agrupamentos da versão 100 (ou seja, aqueles com _100_nomes).

    • 31

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