2011-11-11 12 views
14

को ठीक करने के लिए वर्कर को किसी अन्य संयोजन (कोड पृष्ठ) में कनवर्ट करें I SQL सर्वर डेटाबेस से पूछताछ कर रहा हूं जो SQL_Latin1_General_CP850_BIN2 संयोजन का उपयोग करता है। तालिका पंक्तियों में से एक में वर्चर होता है जिसमें +/- वर्ण (विंडोज -1252 कोडपेज में दशमलव कोड 177) शामिल होता है।एसक्यूएल सर्वर - अक्षर एन्कोडिंग

जब मैं सीधे SQL सर्वर प्रबंधन स्टूडियो में तालिका से क्वेरी करता हूं, तो मुझे इस पंक्ति में +/- चरित्र के बजाय एक गिबिश वर्ण मिलता है। जब मैं एक एसएसआईएस पैकेज में स्रोत के रूप में इस तालिका का उपयोग करता हूं, गंतव्य तालिका (जो सामान्य SQL_Latin1_General_CP1_CI_AS संयोजन का उपयोग करती है), सही +/- वर्ण के साथ समाप्त होती है।

अब मुझे एक ऐसी तंत्र बनाना है जो सीधे एसएसआईएस के बिना स्रोत तालिका से पूछताछ करे। मैं ऐसा कैसे कर सकता हूं कि मुझे गंदगी के बजाय सही चरित्र मिल जाए? मेरा अनुमान है कि मुझे कॉलम को SQL_Latin1_General_CP1_CI_AS संयोजन में कनवर्ट/कस्ट करने की आवश्यकता होगी, लेकिन यह काम नहीं कर रहा है क्योंकि मुझे एक गिबिश चरित्र मिल रहा है।

मैं कोई भाग्य के साथ निम्नलिखित की कोशिश की है:

select 
columnName collate SQL_Latin1_General_CP1_CI_AS 
from tableName 

select 
cast (columnName as varchar(100)) collate SQL_Latin1_General_CP1_CI_AS 
from tableName 

select 
convert (varchar, columnName) collate SQL_Latin1_General_CP1_CI_AS 
from tableName 

क्या मैं गलत कर रहा हूँ?

+1

में आपका स्वागत है: यदि आप कोड एक्सएमएल या डेटा के नमूने पोस्ट, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड नमूने" बटन ('{}') पर क्लिक करें ताकि इसे अच्छी तरह से प्रारूपित और सिंटैक्स हाइलाइट किया जा सके! –

उत्तर

1

हमें और जानकारी की आवश्यकता हो सकती है। SQL Server 2008:

CREATE DATABASE [Test] ON PRIMARY 
    ( 
    NAME = N'Test' 
    , FILENAME = N'...Test.mdf' 
    , SIZE = 3072KB 
    , FILEGROWTH = 1024KB 
    ) 
    LOG ON 
    ( 
    NAME = N'Test_log' 
    , FILENAME = N'...Test_log.ldf' 
    , SIZE = 1024KB 
    , FILEGROWTH = 10% 
    ) 
    COLLATE SQL_Latin1_General_CP850_BIN2 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[MyTable] 
    (
    [SomeCol] [varchar](50) NULL 
    ) ON [PRIMARY] 
GO 
Insert MyTable(SomeCol) 
Select '±' Collate SQL_Latin1_General_CP1_CI_AS 
GO 
Select SomeCol, SomeCol Collate SQL_Latin1_General_CP1_CI_AS 
From MyTable 

परिणाम मूल चरित्र दिखाते हैं। क्वेरी में collation घोषित करने से SQL सर्वर के परिप्रेक्ष्य से उचित वर्ण वापस लौटाया जाना चाहिए, हालांकि यह मामला हो सकता है कि प्रस्तुति परत तब यूटीएफ -8 की तरह कुछ अलग हो जाती है।

8

कैरेक्टर सेट रूपांतरण डेटाबेस कनेक्शन स्तर पर किया गया है। आप पैरामीटर "ऑटो अनुवाद = गलत" पैरामीटर के साथ ओडीबीसी या एडीओडीबी कनेक्शन स्ट्रिंग में स्वचालित रूपांतरण को मजबूर कर सकते हैं। यह अनुशंसित नहीं है। देखें: https://msdn.microsoft.com/en-us/library/ms130822.aspx

SQL सर्वर 2005 में एक कोडपेज असंगतता है जब डेटाबेस और क्लाइंट कोडपृष्ठ मेल नहीं खाता था। https://support.microsoft.com/kb/KbView/904803

एसक्यूएल-प्रबंधन कंसोल 2008 और ऊपर एक यूनिकोड आवेदन है। दर्ज या अनुरोध किए गए सभी मानों को एप्लिकेशन स्तर पर इस प्रकार व्याख्या किया जाता है। कॉलम संयोजन से और उससे बातचीत बातचीत पूरी तरह से की जाती है। आप के साथ इस की पुष्टि कर सकते हैं:

SELECT CAST(N'±' as varbinary(10)) AS Result 

यह 0xB100 जो यूनिकोड वर्ण U + 00B1 (प्रबंधन कंसोल विंडो में डाला गया है) है वापस आ जाएगी। आप प्रबंधन स्टूडियो के लिए "ऑटो अनुवाद" बंद नहीं कर सकते हैं।

यदि आप चयन में एक अलग संयोजन निर्दिष्ट करते हैं, तो अंततः आप "ऑटो अनुवाद" सक्रिय होने तक एक डबल रूपांतरण (संभव डेटा हानि के साथ) में समाप्त हो जाते हैं। मूल चरित्र को सबसे पहले चयन के दौरान नए संयोजन में बदल दिया जाता है, जो बदले में "उचित" एप्लिकेशन कोडपेज पर "ऑटो अनुवादित" हो जाता है। यही कारण है कि आपके विभिन्न COLLATION परीक्षण अभी भी एक ही परिणाम दिखाते हैं।

आप सत्यापित कर सकते हैं कि मिलान को निर्दिष्ट करता है, चयन में एक प्रभाव हो अगर आप पहले यह प्रस्तुत किया है VARCHAR तो एसक्यूएल सर्वर परिवर्तन ग्राहक द्वारा अवैध नहीं है के बजाय VARBINARY के रूप में परिणाम डाली:

SELECT cast(columnName COLLATE SQL_Latin1_General_CP850_BIN2 as varbinary(10)) from tableName 
SELECT cast(columnName COLLATE SQL_Latin1_General_CP1_CI_AS as varbinary(10)) from tableName 

यह आपको 0xF1 मिल जाएगा या 0xB1 क्रमशः अगर columnName सिर्फ चरित्र '±' शामिल

तुम अब भी सही परिणाम और अभी तक एक गलत चरित्र, मिल सकता है अगर फॉन्ट का प्रयोग कर रहे जनसंपर्क प्रदान नहीं करता है ग्लिफ संचालित करें।

कृपया अच्छी एक उचित नमूना पर VARBINARY करने के लिए क्वेरी कास्टिंग द्वारा अपने चरित्र की वास्तविक आंतरिक प्रतिनिधित्व की जाँच करें और सत्यापित करें कि क्या इस कोड को वास्तव में परिभाषित डाटाबेस मिलान से मेल खाती है SQL_Latin1_General_CP850_BIN2

SELECT CAST(columnName as varbinary(10)) from tableName 

आवेदन मिलान और डेटाबेस में मतभेद जब तक रूपांतरण हमेशा एक ही तरीके से किया जाता है तब तक कोलेक्शन अनजान हो सकता है। जैसे ही आप एक अलग संयोजन के साथ एक ग्राहक जोड़ते हैं, परेशानी उभरती है। फिर आप पाएंगे कि आंतरिक रूपांतरण वर्णों से सही मिलान करने में असमर्थ है।

जो कुछ भी कहा गया है, आपको यह ध्यान में रखना चाहिए कि परिणाम स्टूडियो आमतौर पर परिणाम सेट की व्याख्या करते समय अंतिम संदर्भ नहीं है। भले ही यह एमएस में अस्पष्ट दिखता है, फिर भी यह सही आउटपुट हो सकता है। सवाल यह है कि क्या आपके अनुप्रयोगों में रिकॉर्ड सही तरीके से दिखाई देते हैं।

1

कोशिश:

SELECT CAST(CAST([field] AS VARBINARY) AS varchar) 
+0

यह मेरे लिए काम किया। बु भी मुझे यह भी जोड़ने की ज़रूरत है कि प्रोग्रामर को लंबाई जैसे संकेत (VARBINARY (120)) ... VARCHAR (120)। अगर यह आउटपुट में कटौती नहीं करता है। –

3

इस्तेमाल किया जाना चाहिए परिवर्तित, कच्चा नहीं: StackOverflow को

SELECT 
CONVERT(varchar(50), N'æøåáäĺćçčéđńőöřůýţžš') 
COLLATE Cyrillic_General_CI_AI 

(http://blog.sqlpositive.com/2010/03/using-convert-with-collate-to-strip-accents-from-unicode-strings/)

+0

जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (// meta.stackoverflow.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। – manetsus

संबंधित मुद्दे