2015-07-03 18 views
5

In SQL Server 2012 ho una tabella con una colonna nvarchar con collation Latin1_General_100_CI_AS_ SC, che suppone supportare caratteri di coppia surrogata unicode o caratteri supplementari.query Unicode SQL Server con SC Collation

  1. Quando faccio funzionare questa domanda:

    select KeyValue from terms where KeyValue = N'➰' 
    

    (sopra è un Unicode SC)
    sopra è un personaggio ciclo riccio con il codice 10160 (x27B0)
    Il il risultato sono centinaia di voci di singoli caratteri dall'aspetto diverso, anche se hanno tutti codepoints UTF-16 diversi. È dovuto alla collazione? Perché non c'è una corrispondenza esatta?

    EDIT: ora penso che questo sia dovuto alle regole di confronto. Sembra che ci sia un gruppo di caratteri "non definiti" nell'intervallo UTF-16, più di 1733 caratteri e sono trattati allo stesso modo da questo confronto. Sebbene i caratteri con codici superiori a 65535 vengano considerati come univoci e tali query restituiscono corrispondenze esatte.

  2. Le due query sotto hanno risultati diversi:

    select KeyValue from terms where KeyValue = N'π' 
    

    restituisce 3 righe: ¸ e ¸ e ᴨ

    select KeyValue from terms where KeyValue LIKE N'π' 
    

    restituisce i 2 file: ¸ e π

    Perché è questo ?

  3. Questo è il più strano di tutti. La seguente interrogazione:

    select KeyValue from terms where KeyValue like N'➰%' 
    

    rendimenti QUASI TUTTI I record della tabella, che ha molti dei personaggi più regolari termini di set di caratteri latini come "8W" o "mela". Il 90% di quelli che non vengono restituiti iniziano con "æ". Che cosa sta succedendo?

NOTA: Giusto per dare un po 'di contesto, questi sono tutti i titoli degli articoli di Wikipedia, non stringhe casuali.

+0

Le regole di confronto SC-aware del database sono? Influirà sui valori letterali delle stringhe nelle tue query. –

+0

Le regole di confronto predefinite di @RogerWolf Database sono le stesse, se questo è ciò che intendi. –

+0

Come viene definito 'KeyValue'defined? 'nvarchar (x)', presumo? o 'varchar (x)'? –

risposta

0

SQL Server e quindi tempdb hanno anche le proprie regole di confronto e potrebbero non corrispondere alle regole di confronto di un database o di una colonna. Mentre i letterali dei caratteri dovrebbero essere assegnati alle regole di confronto predefinite della colonna o del database, gli esempi T-SQL sopra descritti (forse eccessivamente semplificati) potrebbero essere errati o non rivelare il vero problema. Ad esempio, una clausola ORDER BY potrebbe essere stata omessa per motivi di semplicità. I risultati attesi vengono restituiti quando le istruzioni precedenti utilizzano esplicitamente https://msdn.microsoft.com/en-us/library/ms184391.aspx ('COLLATE Latin1_General_100_CI_AS_SC')?