2011-03-03 5 views
5

SQL Server에서 코드 페이지의 문자가 실제로 해당 데이터 정렬의 테스트 데이터베이스를 만들지 않고 어떤 문자를 나타낼 지 판단 할 수 있습니까?SQL Server 코드 페이지 및 데이터 정렬

예. 데이터 정렬 SQL_Ukrainian_CP1251_CS_AS으로 테스트 데이터베이스를 만든 다음 CHAR(255)을 수행하면 я을 반환합니다. 내가하려고하면

SQL_Latin1_General_CP1_CS_AS 데이터 정렬 데이터베이스에서 다음 그러나

SELECT CHAR(255) COLLATE SQL_Ukrainian_CP1251_CS_AS 

그것은 y

SELECT CHAR(255) 

반환 값을 반환 ÿ 그래서 분명히 찾기 위해 노력하고 다음 데이터베이스의 기본 데이터 정렬을 통해 최초의 것입니다 명시 적 데이터 정렬에서와 가장 유사한 것입니다. 피할 수 있습니까?

답변

2

MS SQL은 코드 페이지와 유니 코드를 모두 도움이되지만 두 코드간에 변환 할 수있는 기능을 제공하지 않으므로 다른 코드 페이지의 값으로 표현되는 문자가 돼지인지 알 수 있습니다.

내가 변환을 처리 할 본 적이 두 가지 잠재적 인 방법이 있습니다, 하나는 여기 http://www.codeguru.com/cpp/data/data-misc/values/article.php/c4571 을 자세히 설명하고 데이터베이스에 사용자 정의 변환 프로그램을 볼트와 전환을 위해 그 사용이 포함됩니다.

다른 하나 nchar() 또는 NCHAR 당신은을 사용

자체를 사용하여 변환 할 수있는 유니 코드 문자를 나타내는 int 하나로서 저장된 유니 코드 값

[CodePage], [ANSI Value], [UnicodeValue] 

구성된 DB 테이블을 구성하는 것입니다 코드 페이지 1251 (문자열 중앙의 CP1251) 인 데이터 정렬 SQL_Ukrainian_CP1251_CS_AS 여기서 변환 표를 가져올 수 있습니다. http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT

원시 데이터를 잘라내어 TSV로 처리하면 공정하게 깨끗하게 가져와야합니다.

개인적으로 전적으로 프로덕션 서버보다 후자쪽으로 더 기울기 때문에 이전에는 불안정성이 생길 수 있습니다.

7

사실 내 질문에 대한 답변을 찾았습니다. 조금 더 어색하지만 거기에 더 좋은 방법이없는 한 일을합니까?

SET NOCOUNT ON; 

CREATE TABLE #Collations 
(
    code TINYINT PRIMARY KEY 
); 

WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1), --2 
     E02(N) AS (SELECT 1 FROM E00 a, E00 b), --4 
     E04(N) AS (SELECT 1 FROM E02 a, E02 b), --16 
     E08(N) AS (SELECT 1 FROM E04 a, E04 b) --256 
INSERT INTO #Collations 
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) - 1 
FROM E08  

DECLARE @AlterScript NVARCHAR(MAX) = '' 

SELECT @AlterScript = @AlterScript + ' 
RAISERROR(''Processing' + name + ''',0,1) WITH NOWAIT; 
ALTER TABLE #Collations ADD ' + name + ' CHAR(1) COLLATE ' + name + '; 
EXEC(''UPDATE #Collations SET ' + name + '=CAST(code AS BINARY(1))''); 
EXEC(''UPDATE #Collations SET ' + name + '=NULL WHERE ASCII(' + name + ') <> code''); 
' 
FROM sys.fn_helpcollations() 
WHERE name LIKE '%CS_AS' 
     AND name NOT IN /*Unicode Only Collations*/ 
         ('Assamese_100_CS_AS', 'Bengali_100_CS_AS', 
         'Divehi_90_CS_AS', 'Divehi_100_CS_AS' , 
         'Indic_General_90_CS_AS', 'Indic_General_100_CS_AS', 
          'Khmer_100_CS_AS', 'Lao_100_CS_AS', 
         'Maltese_100_CS_AS', 'Maori_100_CS_AS', 
         'Nepali_100_CS_AS', 'Pashto_100_CS_AS', 
         'Syriac_90_CS_AS', 'Syriac_100_CS_AS', 
         'Tibetan_100_CS_AS') 


EXEC (@AlterScript) 

SELECT * FROM #Collations 

DROP TABLE #Collations