Why does SQL_Latin1_General_CP1_CI_AS sort number-sign before underscore?
Following up on https://stackoverflow.com/a/32233795/14731 , I was surprised to discover that: DECLARE @SampleData TABLE (ANSI VARCHAR(50), UTF16 NVARCHAR(50)); INSERT INTO @SampleData (ANSI, UTF16) VALUES ('##MS_PolicyTsqlExecutionLogin##', N'##MS_PolicyTsqlExecutionLogin##'), ('_gaia', N'_gaia'); SELECT sd.ANSI AS [ANSI-SQL_Latin1_General_CP1_CI_AS] FROM @SampleData sd ORDER BY sd.ANSI COLLATE SQL_Latin1_General_CP1_CI_AS ASC; SELECT sd.UTF16 AS [UTF16-SQL_Latin1_General_CP1_CI_AS] FROM @SampleData sd ORDER BY sd.UTF16 COLLATE SQL_Latin1_General_CP1_CI_AS ASC; Results in: ANSI-SQL_Latin1