Orden de sorting de SQL Server con caracteres no imprimibles

Tengo una function de valor escalar que devuelve un varchar de datos que contiene el separador de la unidad ASCII Char (31). Estoy usando este resultado como parte de una cláusula Order By e bash orderar en order ascendente.

Mi function de valor escalar arroja resultados como el siguiente (carácter no imprimible explicado como reference)

  • A B C
  • ABC (CHAR (31)) DEF
  • ABC (CHAR (31)) DEF (CHAR (31)) HIJ

Esperaría que cuando ordero al ascender los resultados serían los siguientes:

  • A B C
  • A B C D E F
  • ABCDEFHIJ

en cambio, estoy viendo los resultados como todo lo contrario:

  • ABCDEFHIJ
  • A B C D E F
  • A B C

Ahora estoy bastante seguro de que esto tiene que ver con los caracteres no imprimibles, pero no estoy seguro de por qué. ¿Alguna idea de por qué ese es el caso?

Gracias

El order de sorting puede verse influenciado por su configuration COLLATION . Siguiendo la secuencia de commands, el uso explícito de Latin1_General_CI_AS como order de Latin1_General_CI_AS ordera los elementos como era de esperar.

 ;WITH q (Col) AS ( SELECT 'ABC' UNION ALL SELECT 'ABC' + CHAR(31) + 'DEF' UNION ALL SELECT 'ABC' + CHAR(31) + 'DEF' + CHAR(31) + 'HIJ' ) SELECT * FROM q ORDER BY Col COLLATE Latin1_General_CI_AS 

¿Qué queueción estás usando? Puede verificar la configuration de queueción de su database actual con

 SELECT DATABASEPROPERTYEX('master', 'Collation') SQLCollation; 

Puedo duplicar este comportamiento en SQL Server 2008 R2 con la intercalación establecida en SQL_Latin1_General_CP1_CI_AS .

Si no puede cambiar la configuration de intercalación, establezca el campo en nvarchar lugar de varchar . Esto resolvió el problema para mí.

    Intereting Posts