এসকিউএল 2005 [এসকিউএল_ল্যাটিন 1_ জেনারাল_সিপি 1_সিআই_এএস] থেকে 2008 এ স্থানান্তরিত - আমি 'পিছনের সামঞ্জস্যতা' ব্যবহার করে কোনও বৈশিষ্ট্য হারাব


18

আমরা এসকিউএল ২০০৫ [ইনস্ট্যান্স এবং ডিবি-র কোলেশন রয়েছে SQL_Latin1_General_CP1_CI_AS] থেকে এসকিউএল ২০০ to এ চলেছি [যা ডিফল্ট হয়েছে Latin1_General_CI_AS]।

আমি একটি এসকিউএল ২০০৮ আর 2 ইনস্টলেশন সম্পন্ন করেছি Latin1_General_CI_ASএবং ডেটাবেস পুনরুদ্ধার করার পরেও ডিফল্ট কলিশ ব্যবহার করেছি SQL_Latin1_General_CP1_CI_AS। ব্যতীত সমস্যাগুলি দেখা দিয়েছে - # টিম টেবিলগুলি যেখানে যেখানে Latin1_General_CI_ASডিবি ছিল SQL_Latin1_General_CP1_CI_ASএবং এটি এখন যেখানে আমি রয়েছি - দয়া করে দয়া করে আমার সমস্যাগুলির বিষয়ে পরামর্শ প্রয়োজন।

এসকিউএল 2008 R2 হলো ইনস্টলেশনের, আমি ব্যবহার ইনস্টলেশনের উপর বিকল্প আছে 'SQL Collation, used for backwards compatibility'যেখানে আমি 2005 ডাটাবেসের হিসাবে একই কোলেশন নির্বাচন করতে বিকল্প আছে: SQL_Latin1_General_CP1_CI_AS

  1. এটি আমাকে # টেম্প টেবিলগুলির সাথে সমস্যা না হওয়ার অনুমতি দেবে, তবে কোনও সমস্যা আছে কি?

  2. এসকিউএল ২০০৮ এর "বর্তমান" কোলেশন ব্যবহার না করে আমি কি কোনও কার্যকারিতা বা কোনও ধরণের বৈশিষ্ট্য হারাব?

  3. ২০০৮ থেকে এসকিউএল ২০১২ তে আমরা যখন (উদাহরণস্বরূপ 2 বছর) চলে যাব তখন কী হবে? আমার কি তখন সমস্যা হবে?
  4. আমি কি এক পর্যায়ে যেতে বাধ্য হব Latin1_General_CI_AS?

  5. আমি পড়েছি যে কিছু ডিবিএর স্ক্রিপ্ট সম্পূর্ণ ডাটাবেসের সারিটি সম্পূর্ণ করে, এবং তারপরে নতুন কোলেশন দিয়ে ডাটাবেজে সন্নিবেশ স্ক্রিপ্টটি চালান - আমি খুব ভয় পাচ্ছি এবং এ থেকে সতর্ক - আপনি কি এটি করার পরামর্শ দিবেন?


2
আপনি যদি ভাবেন যে আপনি এসকিউএল সার্ভার ২০১৪ সালে হেকাটনে প্রবেশ করতে পারেন তবে আপনি পড়া বিবেচনা করতে পারেন এমন অন্য কিছু এখানে
অ্যারন বারট্রান্ড

উত্তর:


20

প্রথমত, এত দীর্ঘ উত্তরের জন্য ক্ষমাপ্রার্থী, কারণ আমি অনুভব করি যে লোকেরা যখন কোলেশন, সাজান অর্ডার, কোড পৃষ্ঠা ইত্যাদির মতো পদগুলি নিয়ে কথা বলে তখনও অনেক বিভ্রান্তি দেখা দেয়

বিওএল থেকে :

এসকিউএল সার্ভারে কলশনগুলি আপনার ডেটার জন্য বাছাইয়ের নিয়ম, কেস এবং অ্যাকসেন্ট সংবেদনশীলতা বৈশিষ্ট্য সরবরাহ করে । চর এবং ডেটা যেমন চরিত্রের ডেটা টাইপের সাথে ব্যবহৃত হয় সেগুলি কোড পৃষ্ঠা এবং সংশ্লিষ্ট অক্ষরগুলিকে নির্দেশ করে যা সেই তথ্য প্রকারের জন্য প্রতিনিধিত্ব করতে পারে। আপনি এসকিউএল সার্ভারের একটি নতুন উদাহরণ ইনস্টল করছেন, একটি ডাটাবেস ব্যাকআপ পুনরুদ্ধার করছেন, বা ক্লায়েন্ট ডাটাবেসের সাথে সার্ভারটি সংযুক্ত করছেন, আপনার প্রয়োজনীয় স্থানীয় ডেটা প্রয়োজনীয়তা, ক্রম বাছাই, এবং আপনি যে ডেটা নিয়ে কাজ করবেন সেটি অ্যাকসেন্ট সংবেদনশীলতা বুঝতে গুরুত্বপূর্ণ important ।

এর অর্থ হ'ল কোলেশনটি অত্যন্ত গুরুত্বপূর্ণ কারণ এটি কীভাবে ডেটার অক্ষরের স্ট্রিংগুলি সাজানো এবং তুলনা করা যায় তার বিধিগুলি নির্দিষ্ট করে।

দ্রষ্টব্য: COLLATIONPROPERTY- এ আরও তথ্য

এখন প্রথমে পার্থক্যগুলি বুঝতে পারি ......

টি-এসকিউএল এর নীচে চলছে:

SELECT *
FROM::fn_helpcollations()
WHERE NAME IN (
        'SQL_Latin1_General_CP1_CI_AS'
        ,'Latin1_General_CI_AS'
        )
GO

SELECT 'SQL_Latin1_General_CP1_CI_AS' AS 'Collation'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'CodePage') AS 'CodePage'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'LCID') AS 'LCID'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'ComparisonStyle') AS 'ComparisonStyle'
    ,COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'Version') AS 'Version'

UNION ALL

SELECT 'Latin1_General_CI_AS' AS 'Collation'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'CodePage') AS 'CodePage'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'LCID') AS 'LCID'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'ComparisonStyle') AS 'ComparisonStyle'
    ,COLLATIONPROPERTY('Latin1_General_CI_AS', 'Version') AS 'Version'
GO

ফলাফলগুলি হবে:

এখানে চিত্র বর্ণনা লিখুন

উপরের ফলাফলগুলি দেখলে, কেবলমাত্র 2 টি কোলিশনের মধ্যে অর্ডার বাছাই করা একমাত্র পার্থক্য B তবে এটি সত্য নয়, যা আপনি নীচের মতো দেখতে পারেন:

পরীক্ষা 1:

--Clean up previous query
IF OBJECT_ID('Table_Latin1_General_CI_AS') IS NOT NULL
    DROP TABLE Table_Latin1_General_CI_AS;

IF OBJECT_ID('Table_SQL_Latin1_General_CP1_CI_AS') IS NOT NULL
    DROP TABLE Table_SQL_Latin1_General_CP1_CI_AS;

-- Create a table using collation Latin1_General_CI_AS 
CREATE TABLE Table_Latin1_General_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE Latin1_General_CI_AS
    )

-- add some data to it 
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('Kin_Tester1')

-- Create second table using collation SQL_Latin1_General_CP1_CI_AS 
CREATE TABLE Table_SQL_Latin1_General_CP1_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS
    )

-- add some data to it 
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('Kin_Tester1')

--Now try to join both tables
SELECT *
FROM Table_Latin1_General_CI_AS LG
INNER JOIN Table_SQL_Latin1_General_CP1_CI_AS SLG ON LG.Comments = SLG.Comments
GO

পরীক্ষার ফলাফল 1:

Msg 468, Level 16, State 9, Line 35
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.

উপরের ফলাফলগুলি থেকে আমরা দেখতে পাচ্ছি যে আমরা সরাসরি কলামগুলির সাথে বিভিন্ন কোলিশের সাথে মানগুলির তুলনা করতে পারি না, COLLATEকলাম মানগুলির তুলনা করতে আপনাকে ব্যবহার করতে হবে।

পরীক্ষা 2:

এমএসডিএন- তে এই আলোচনায় এরল্যান্ড سومমারস্কগ উল্লেখ করেছেন বলে প্রধান পার্থক্যটি হচ্ছে পারফরম্যান্স ।

--Clean up previous query
IF OBJECT_ID('Table_Latin1_General_CI_AS') IS NOT NULL
    DROP TABLE Table_Latin1_General_CI_AS;

IF OBJECT_ID('Table_SQL_Latin1_General_CP1_CI_AS') IS NOT NULL
    DROP TABLE Table_SQL_Latin1_General_CP1_CI_AS;

-- Create a table using collation Latin1_General_CI_AS 
CREATE TABLE Table_Latin1_General_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE Latin1_General_CI_AS
    )

-- add some data to it 
INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_Latin1_General_CI_AS (Comments)
VALUES ('kin_tester1')

-- Create second table using collation SQL_Latin1_General_CP1_CI_AS 
CREATE TABLE Table_SQL_Latin1_General_CP1_CI_AS (
    ID INT IDENTITY(1, 1)
    ,Comments VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS
    )

-- add some data to it 
INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_test1')

INSERT INTO Table_SQL_Latin1_General_CP1_CI_AS (Comments)
VALUES ('kin_tester1')

--- উভয় টেবিলে সূচি তৈরি করুন

CREATE INDEX IX_LG_Comments ON  Table_Latin1_General_CI_AS(Comments)
go
CREATE INDEX IX_SLG_Comments ON  Table_SQL_Latin1_General_CP1_CI_AS(Comments)

--- প্রশ্নগুলি চালান

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_Latin1_General_CI_AS WHERE Comments = 'kin_test1'
GO

--- এটির আইএমপিএলসিটি রূপান্তর থাকবে

এখানে চিত্র বর্ণনা লিখুন

--- প্রশ্নগুলি চালান

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_SQL_Latin1_General_CP1_CI_AS WHERE Comments = 'kin_test1'
GO

--- এটির IMPLICIT রূপান্তর থাকবে না

এখানে চিত্র বর্ণনা লিখুন

অন্তর্নিহিত রূপান্তর জন্য কারণ কারণ, আমি উভয় হিসাবে আমার ডাটাবেসের & সার্ভার কোলেশন আছে SQL_Latin1_General_CP1_CI_ASএবং টেবিল Table_Latin1_General_CI_AS কলাম হয়েছে মন্তব্যসমূহ হিসাবে সংজ্ঞায়িত VARCHAR(50)সঙ্গে ক্রমসজ্জিত Latin1_General_CI_AS , তাই লুকআপ SQL সার্ভার একটি অন্তর্নিহিত রূপান্তর কি আছে সময়।

পরীক্ষা 3:

একই সেট আপ করার সাথে সাথে, এখন এক্সিকিউশন পরিকল্পনাগুলির পরিবর্তনগুলি দেখার জন্য আমরা বর্ণচর কলামগুলি এনভারচর মানগুলির সাথে তুলনা করব।

- কোয়েরি চালান

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_Latin1_General_CI_AS WHERE Comments =  (SELECT N'kin_test1' COLLATE Latin1_General_CI_AS)
GO

এখানে চিত্র বর্ণনা লিখুন

- কোয়েরি চালান

DBCC FREEPROCCACHE
GO
SELECT Comments FROM Table_SQL_Latin1_General_CP1_CI_AS WHERE Comments = N'kin_test1'
GO

এখানে চিত্র বর্ণনা লিখুন

নোট করুন যে প্রথম ক্যোয়ারী ইনডেক্স সন্ধান করতে সক্ষম তবে ইম্পিলিকেট রূপান্তর করতে হবে যখন দ্বিতীয়টি একটি সূচক স্ক্যান করে যা এটি যখন বড় টেবিলগুলি স্ক্যান করবে তখন পারফরম্যান্সের ক্ষেত্রে অক্ষম প্রমাণিত হয়।

উপসংহার:

  • উপরের সমস্ত পরীক্ষাগুলি দেখায় যে আপনার ডাটাবেস সার্ভারের উদাহরণগুলির জন্য ডান কোলেশন থাকা খুব গুরুত্বপূর্ণ।
  • SQL_Latin1_General_CP1_CI_AS নিয়মগুলির সাথে একটি এসকিউএল কোলিশেশন যা আপনাকে ইউনিকোড এবং নন-ইউনিকোডের জন্য ডেটা বাছাই করতে দেয়।
  • উপরের পরীক্ষায় দেখা গেছে যে ইউনিকোড এবং নন-ইউনিকোড ডেটা তুলনা করার সময় এসকিউএল কোলিশেশন সূচকটি ব্যবহার করতে সক্ষম হবে না যখন এনভারচচার ডেটা ভার্চার ডেটার সাথে তুলনা করার সময় এটি সূচক স্ক্যান করে এবং অনুসন্ধান করে না।
  • Latin1_General_CI_AS এই বিধিগুলির সাথে একটি উইন্ডোজ কোলেশন যা আপনাকে ইউনিকোড এবং নন-ইউনিকোডের জন্য ডেটা বাছাই করতে দেয়।
  • ইউনিকোড এবং নন-ইউনিকোড ডেটার তুলনা করার সময় উইন্ডোজ কোলেশন সূচকটি (উপরের উদাহরণে সূচকগুলি সন্ধান করে) ব্যবহার করতে পারে তবে আপনি সামান্য পারফরম্যান্স পেনাল্টি দেখতে পান।
  • তিনি উচ্চারণ করেছেন আর্মল্যান্ড সোমমারস্কোগ উত্তর + সংযুক্ত আইটেমগুলি যেটিতে তিনি নির্দেশ করেছেন read

এটি আমাকে # টেম্প টেবিলগুলির সাথে সমস্যা না হওয়ার অনুমতি দেবে, তবে কোনও সমস্যা আছে কি?

আমার উত্তর উপরে দেখুন।

এসকিউএল ২০০৮ এর "বর্তমান" কোলেশন ব্যবহার না করে আমি কি কোনও কার্যকারিতা বা কোনও ধরণের বৈশিষ্ট্য হারাব?

এটি কী কী কার্যকারিতা / বৈশিষ্ট্যগুলি আপনি উল্লেখ করছেন তার উপর নির্ভর করে। কোলেশন ডেটা সংরক্ষণ এবং বাছাই করা হয়।

২০০৮ থেকে এসকিউএল ২০১২ তে আমরা যখন (উদাহরণস্বরূপ 2 বছর) চলে যাব তখন কী হবে? আমার কি তখন সমস্যা হবে? আমি কি কোনও সময় ল্যাটিন 1_ জেনারাল_সিআই_এএস এ যেতে বাধ্য হব?

ক্যান্ট ভাউচ! যেহেতু জিনিসগুলি পরিবর্তিত হতে পারে এবং মাইক্রোসফ্টের পরামর্শের সাথে অন্তর্নিহিত থাকা সর্বদা ভাল you আপনার ডেটা এবং আমি উপরে উল্লিখিত সমস্যাগুলি বুঝতে হবে। এছাড়াও পড়ুন এই এবং এই কানেক্ট আইটেম।

আমি পড়েছি যে কিছু ডিবিএর স্ক্রিপ্ট সম্পূর্ণ ডাটাবেসের সারিটি সম্পূর্ণ করে, এবং তারপরে নতুন কোলেশন দিয়ে ডাটাবেজে সন্নিবেশ স্ক্রিপ্টটি চালান - আমি খুব ভয় পাচ্ছি এবং এ থেকে সতর্ক - আপনি কি এটি করার পরামর্শ দিবেন?

আপনি যখন কোলেশন পরিবর্তন করতে চান, তখন এই জাতীয় স্ক্রিপ্টগুলি দরকারী। সার্ভারের জোটের সাথে অনেক বার মিলার জন্য আমি নিজেকে ডেটাবেসগুলির কোলেশন পরিবর্তন করতে দেখেছি এবং আমার কাছে এমন কিছু স্ক্রিপ্ট রয়েছে যা এটি বেশ ঝরঝরে করে। আপনার প্রয়োজন হলে আমাকে জানান।

তথ্যসূত্র:


5

@ কিন তার উত্তরে যা বিস্তারিত বলেছেন তা ছাড়াও , সার্ভারের (যেমন উদাহরণস্বরূপ) ডিফল্ট কোলিশন (অনুভূমিক রেখার উপরে আইটেমগুলি প্রশ্নে উল্লিখিত দুটি কোলেশনের সাথে সরাসরি প্রাসঙ্গিকভাবে স্যুইচ করার সময় আরও কয়েকটি বিষয় অবগত থাকতে হবে; আইটেমগুলি অনুভূমিক লাইনের নীচে সাধারণের সাথে প্রাসঙ্গিক):

  • যদি আপনার ডেটাবেস ডিফল্ট কোলেশন হয় না পরিবর্তন করার সময়, তারপর "অন্তর্নিহিত রূপান্তর" কর্মক্ষমতা সংখ্যায় @ কিন এর উত্তর করা উচিত বর্ণনা না একটি সমস্যা হতে যেহেতু স্ট্রিং লিটারেল এবং স্থানীয় ভেরিয়েবল ডাটাবেস ডিফল্ট কোলেশন না সার্ভারের ব্যবহার করুন। দৃশ্যের জন্য কেবলমাত্র প্রভাবগুলি যেখানে উদাহরণস্বরূপ কোলেশন পরিবর্তন করা হয় তবে ডাটাবেস স্তরের কোলেশন নয় (উভয়ই নীচে বিশদে বর্ণিত):

    • অস্থায়ী টেবিলগুলির সাথে সম্ভাব্য কোল্যাশনের বিরোধ (তবে টেবিলের ভেরিয়েবল নয়)।
    • ভেরিয়েবল এবং / অথবা কার্সারগুলির কেসিং যদি তাদের ঘোষণাপত্রের সাথে মেলে না তবে সম্ভাব্য ভাঙা কোড (তবে এটি কেবল তখনই ঘটতে পারে যখন বাইনারি বা কেস-সংবেদনশীল কোলেশন সহ কোনও উদাহরণে চলে যাওয়া)।
  • এই দুটি কোলিশনের মধ্যে একটি পার্থক্য হ'ল তারা কীভাবে VARCHARডেটার জন্য নির্দিষ্ট অক্ষরকে বাছাই করে (এটি NVARCHARডেটা প্রভাবিত করে না )। নন-ইসিবিডিআইডিসি SQL_কোলিশেশন VARCHARডেটাগুলির জন্য "স্ট্রিং সাজান" হিসাবে ব্যবহার করে, অন্য সমস্ত কোলিশন এমনকি NVARCHARনন-ইসিবিডিডিক SQL_কোলেশনের জন্য ডেটাও "ওয়ার্ড সাজান" বলা হয় যা ব্যবহার করে। পার্থক্যটি হ'ল "ওয়ার্ড বাছাই" তে ড্যাশ -এবং অ্যাডোস্ট্রোফ '(এবং সম্ভবত কিছু অন্যান্য চরিত্র?) খুব কম ওজন দেওয়া হয়েছে এবং স্ট্রিংগুলিতে অন্য কোনও পার্থক্য না থাকলে মূলত এড়ানো হবে। এই আচরণটি কার্যক্ষম দেখতে, নিম্নলিখিতগুলি চালান:

    DECLARE @Test TABLE (Col1 VARCHAR(10) NOT NULL);
    INSERT INTO @Test VALUES ('aa');
    INSERT INTO @Test VALUES ('ac');
    INSERT INTO @Test VALUES ('ah');
    INSERT INTO @Test VALUES ('am');
    INSERT INTO @Test VALUES ('aka');
    INSERT INTO @Test VALUES ('akc');
    INSERT INTO @Test VALUES ('ar');
    INSERT INTO @Test VALUES ('a-f');
    INSERT INTO @Test VALUES ('a_e');
    INSERT INTO @Test VALUES ('a''kb');
    
    SELECT * FROM @Test ORDER BY [Col1] COLLATE SQL_Latin1_General_CP1_CI_AS;
    -- "String Sort" puts all punctuation ahead of letters
    
    SELECT * FROM @Test ORDER BY [Col1] COLLATE Latin1_General_100_CI_AS;
    -- "Word Sort" mostly ignores dash and apostrophe

    রিটার্নস:

    String Sort
    -----------
    a'kb
    a-f
    a_e
    aa
    ac
    ah
    aka
    akc
    am
    ar

    এবং:

    Word Sort
    ---------
    a_e
    aa
    ac
    a-f
    ah
    aka
    a'kb
    akc
    am
    ar

    আপনি "স্ট্রিং বাছাই" আচরণটি "হারাতে" পারার পরেও আমি নিশ্চিত নই যে আমি এটিকে একটি "বৈশিষ্ট্য" বলব। এটি এমন একটি আচরণ যা অনাকাঙ্ক্ষিত হিসাবে বিবেচিত হয়েছে (এটি প্রমাণ করে যে এটি উইন্ডোজ কোলিশনের কোনওটিতেই সামনে আনা হয়নি)। যাইহোক, এটা হল দুই collations (আবার, শুধু অ EBCDIC জন্য মধ্যবর্তী আচরণের একটি নির্দিষ্ট পার্থক্য VARCHARতথ্য), এবং আপনি "স্ট্রিং সাজান" আচরণ উপর ভিত্তি করে কোড এবং / অথবা গ্রাহকের প্রত্যাশা থাকতে পারে। এটির জন্য আপনার কোডটি পরীক্ষা করা প্রয়োজন এবং ব্যবহারের উপর এই পরিবর্তনটির কোনও নেতিবাচক প্রভাব ফেলতে পারে কিনা তা সম্ভবত অনুসন্ধানের প্রয়োজন requires

  • মধ্যে আরেকটি পার্থক্য SQL_Latin1_General_CP1_CI_ASএবং Latin1_General_100_CI_ASনা করার দক্ষতা প্রসারণ উপর VARCHARতথ্য ( NVARCHARডেটা ইতিমধ্যে অধিকাংশ জন্য এই কাজ করতে পারেন SQL_এমন হ্যান্ডলিং যেমন Collations), æযেমন যদি এটা ছিল ae:

    IF ('æ' COLLATE SQL_Latin1_General_CP1_CI_AS =
        'ae' COLLATE SQL_Latin1_General_CP1_CI_AS)
    BEGIN
      PRINT 'SQL_Latin1_General_CP1_CI_AS';
    END;
    
    IF ('æ' COLLATE Latin1_General_100_CI_AS =
        'ae' COLLATE Latin1_General_100_CI_AS)
    BEGIN
      PRINT 'Latin1_General_100_CI_AS';
    END;

    রিটার্নস:

    Latin1_General_100_CI_AS

    আপনি এখানে কেবলমাত্র "হারাচ্ছেন" কেবল এই বিস্তৃতিগুলি করতে সক্ষম হচ্ছেন না । সাধারণভাবে বলতে গেলে এটি উইন্ডোজ কোলেশনে যাওয়ার আরেকটি সুবিধা। তবে, "স্ট্রিং বাছাই" থেকে "ওয়ার্ড বাছাই" পদক্ষেপের মতো একই সতর্কতা প্রযোজ্য: এটি দুটি কোলেশনের মধ্যে আচরণের একটি সুনির্দিষ্ট পার্থক্য (আবার কেবলমাত্র VARCHARডেটার জন্য ), এবং আপনার কোড এবং / অথবা গ্রাহক থাকতে পারে এই ম্যাপিং না থাকার উপর ভিত্তি করে প্রত্যাশা । এটির জন্য আপনার কোডটি পরীক্ষা করা প্রয়োজন এবং ব্যবহারের উপর এই পরিবর্তনটির কোনও নেতিবাচক প্রভাব ফেলতে পারে কিনা তা সম্ভবত অনুসন্ধানের প্রয়োজন requires

    (এই জবাবটি প্রথমে @ জেরেপথের দ্বারা উল্লেখ করা হয়েছে: এসকিউএল সার্ভার এসকিউএল_ল্যাটিন 1_ জেনারাল_সিপি 1_সিআই_এএস নিরাপদে ল্যাটিন 1_ জেনারাল_সিআই_এএস এ রূপান্তরিত হতে পারে? )

  • সার্ভার-স্তরের কোলেশন সিস্টেম ডাটাবেসের কোলেশন সেট করতে ব্যবহৃত হয়, যার মধ্যে রয়েছে [model][model]ডাটাবেসের নতুন ডাটাবেস তৈরি করতে যার মধ্যে একটি টেমপ্লেট হিসাবে ব্যবহার করা হয় [tempdb]প্রতিটি সার্ভারের প্রারম্ভকালে উপর। তবে, এমনকি কোল্যাশনে কোলিশেশনের পরিবর্তনের সাথে সার্ভার-লেভেল কোলেশন পরিবর্তনের সাথে সাথে [tempdb], ডাটাবেসগুলির মধ্যে কোলেশন পার্থক্যগুলির জন্য সংশোধন করার কিছুটা সহজ উপায় আছে CREATE #TempTableযা মৃত্যুদন্ড কার্যকর হওয়ার সময় এবং "বর্তমান" হয় [tempdb]। অস্থায়ী সারণী তৈরি করার সময়, ক্লজটি ব্যবহার করে একটি কোলেশন ঘোষণা করুন COLLATEএবং এর একটি কোলেশন নির্দিষ্ট করুন DATABASE_DEFAULT:

    CREATE TABLE #Temp (Col1 NVARCHAR(40) COLLATE DATABASE_DEFAULT);

  • একাধিক সংস্করণ উপলব্ধ থাকলে কাঙ্ক্ষিত কোলেশনের সাম্প্রতিকতম সংস্করণটি ব্যবহার করা ভাল। এসকিউএল সার্ভার ২০০৫ সালে শুরু করে, "90" সিরিজের কোলিশ চালু করা হয়েছিল এবং এসকিউএল সার্ভার ২০০৮ "100" সিরিজের কোলিশ চালু করেছিল। নিম্নলিখিত কোয়েরিগুলি ব্যবহার করে আপনি এই জোটগুলি খুঁজে পেতে পারেন:

    SELECT * FROM sys.fn_helpcollations() WHERE [name] LIKE N'%[_]90[_]%'; -- 476
    
    SELECT * FROM sys.fn_helpcollations() WHERE [name] LIKE N'%[_]100[_]%'; -- 2686

    যেহেতু আপনি এসকিউএল সার্ভার ২০০৮ আর 2 তে Latin1_General_100_CI_ASরয়েছেন , আপনার পরিবর্তে এটি ব্যবহার করা উচিত Latin1_General_CI_AS

  • কেস-সংবেদনশীল বাছাই করার সময় এই বিশেষ কোলেশনগুলির (যেমন SQL_Latin1_General_CP1_CS_ASএবং Latin1_General_100_CS_AS) কেস-সংবেদনশীল সংস্করণগুলির মধ্যে পার্থক্য হ'ল আপার-কেস এবং লোয়ার-কেস চিঠিগুলির ক্রম। এটি একক-অক্ষর শ্রেণীর ব্যাপ্তিগুলিকেও প্রভাবিত করে (অর্থাত্ [start-end]) যা LIKEঅপারেটর এবং PATINDEXফাংশনের সাথে ব্যবহার করা যেতে পারে । নিম্নোক্ত তিনটি জিজ্ঞাসা বাছাই এবং চরিত্রের সীমা উভয়ের জন্য এই প্রভাবটি দেখায়:

    SELECT tmp.col AS [Upper-case first]
    FROM (VALUES ('a'), ('A'), ('b'), ('B'), ('c'), ('C')) tmp(col)
    WHERE tmp.col LIKE '%[A-C]%' COLLATE SQL_Latin1_General_CP1_CS_AS
    ORDER BY tmp.col COLLATE SQL_Latin1_General_CP1_CS_AS; -- Upper-case first
    
    SELECT tmp.col AS [Lower-case first]
    FROM (VALUES ('a'), ('A'), ('b'), ('B'), ('c'), ('C')) tmp(col)
    WHERE tmp.col LIKE '%[A-C]%' COLLATE Latin1_General_100_CS_AS
    ORDER BY tmp.col COLLATE Latin1_General_100_CS_AS; -- Lower-case first
    
    SELECT tmp.col AS [Lower-case first]
    FROM (VALUES (N'a'), (N'A'), (N'b'), (N'B'), (N'c'), (N'C')) tmp(col)
    WHERE tmp.col LIKE N'%[A-C]%' COLLATE SQL_Latin1_General_CP1_CS_AS
    ORDER BY tmp.col COLLATE SQL_Latin1_General_CP1_CS_AS; -- Lower-case first

    লোয়ার-কেসের আগে একই অক্ষরের সাজানোর একমাত্র উপায় (একই চিঠির জন্য) হ'ল সেই 31 টি কোলিশনের মধ্যে একটি ব্যবহার করা যা সেই আচরণকে সমর্থন করে, যা হ'ল কলেজ Hungarian_Technical_*এবং মুষ্টিমেয় SQL_কোলিশেশন (যা কেবল VARCHARতথ্যের জন্য এই আচরণকে সমর্থন করে) )।

  • এই নির্দিষ্ট পরিবর্তনের জন্য কম গুরুত্বপূর্ণ, তবে সার্ভারকে বাইনারি বা কেস-সংবেদনশীল কোলেশনে পরিবর্তন করা হলে এটি প্রভাব ফেলবে সে সম্পর্কে এখনও জানা ভাল, এটি হ'ল সার্ভার স্তর স্তরের কোলেশনটিও প্রভাবিত করে:

    • স্থানীয় পরিবর্তনশীল নাম
    • কার্সরের নাম
    • GOTO লেবেল
    • sysnameডেটাটাইপের নাম রেজোলিউশন


    অর্থ, যদি আপনি বা "প্রোগ্রামার যিনি সম্প্রতি বাম" যারা সব খারাপ কোড ;-) জন্য দৃশ্যত দায়ী আবরণ বিষয়ে সতর্ক ছিল না এবং একটি পরিবর্তনশীল ঘোষিত @SomethingIDকিন্তু তারপর যেমন উল্লেখ করা @somethingIdপরে যে, যদি ক্ষেত্রে চলন্ত বিরতি দেবে সংবেদনশীল বা বাইনারি কোলেশন একইভাবে, কোড ব্যবহার করে sysnameডাটাটাইপ কিন্তু এটা বোঝায় SYSNAME, SysNameবা সব ছোট হাতের চেয়ে কিছু অন্যান্য এছাড়াও একটি কেস সংবেদনশীল বা বাইনারি কোলেশন ব্যবহার করে একটি উদাহরণ হিসেবে বলা যায় সরানো ভঙ্গ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.