প্রথমত, এত দীর্ঘ উত্তরের জন্য ক্ষমাপ্রার্থী, কারণ আমি অনুভব করি যে লোকেরা যখন কোলেশন, সাজান অর্ডার, কোড পৃষ্ঠা ইত্যাদির মতো পদগুলি নিয়ে কথা বলে তখনও অনেক বিভ্রান্তি দেখা দেয়
বিওএল থেকে :
এসকিউএল সার্ভারে কলশনগুলি আপনার ডেটার জন্য বাছাইয়ের নিয়ম, কেস এবং অ্যাকসেন্ট সংবেদনশীলতা বৈশিষ্ট্য সরবরাহ করে । চর এবং ডেটা যেমন চরিত্রের ডেটা টাইপের সাথে ব্যবহৃত হয় সেগুলি কোড পৃষ্ঠা এবং সংশ্লিষ্ট অক্ষরগুলিকে নির্দেশ করে যা সেই তথ্য প্রকারের জন্য প্রতিনিধিত্ব করতে পারে। আপনি এসকিউএল সার্ভারের একটি নতুন উদাহরণ ইনস্টল করছেন, একটি ডাটাবেস ব্যাকআপ পুনরুদ্ধার করছেন, বা ক্লায়েন্ট ডাটাবেসের সাথে সার্ভারটি সংযুক্ত করছেন, আপনার প্রয়োজনীয় স্থানীয় ডেটা প্রয়োজনীয়তা, ক্রম বাছাই, এবং আপনি যে ডেটা নিয়ে কাজ করবেন সেটি অ্যাকসেন্ট সংবেদনশীলতা বুঝতে গুরুত্বপূর্ণ 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 আপনার ডেটা এবং আমি উপরে উল্লিখিত সমস্যাগুলি বুঝতে হবে। এছাড়াও পড়ুন এই এবং এই কানেক্ট আইটেম।
আমি পড়েছি যে কিছু ডিবিএর স্ক্রিপ্ট সম্পূর্ণ ডাটাবেসের সারিটি সম্পূর্ণ করে, এবং তারপরে নতুন কোলেশন দিয়ে ডাটাবেজে সন্নিবেশ স্ক্রিপ্টটি চালান - আমি খুব ভয় পাচ্ছি এবং এ থেকে সতর্ক - আপনি কি এটি করার পরামর্শ দিবেন?
আপনি যখন কোলেশন পরিবর্তন করতে চান, তখন এই জাতীয় স্ক্রিপ্টগুলি দরকারী। সার্ভারের জোটের সাথে অনেক বার মিলার জন্য আমি নিজেকে ডেটাবেসগুলির কোলেশন পরিবর্তন করতে দেখেছি এবং আমার কাছে এমন কিছু স্ক্রিপ্ট রয়েছে যা এটি বেশ ঝরঝরে করে। আপনার প্রয়োজন হলে আমাকে জানান।
তথ্যসূত্র: