سؤال

كيف يمكنني معرفة ما إذا كانت قاعدة البيانات في SQL Server القضية الحساسة ؟ لقد سبق تشغيل الاستعلام:

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END

ولكن أنا أبحث عن طرق أخرى لأن هذا فعلا أعطاني القضايا في الماضي.

تحرير - أكثر قليلا من المعلومات:منتج موجود لديه العديد من مكتوب الإجراءات المخزنة.في إجراء مخزن @test != @TEST اعتمادا على حساسية الملقم نفسه.فما أبحث عنه هو أفضل وسيلة للتحقق من خادم حساسيتها.

هل كانت مفيدة؟

المحلول

ترتيب يمكن أن يكون على مختلف المستويات:

  1. الخادم
  2. قاعدة البيانات
  3. العمود

لذلك يمكن أن يكون قضية حساسة عمود في قضية حساسة قاعدة البيانات الخاصة بنا.أنا لم تأتي عبر الحالة التي يكون فيها الأعمال الحالة يمكن أن تكون حالة حساسية من عمود واحد من البيانات ، ولكن أعتقد أنه يمكن أن يكون.

تحقق من ترتيب ملقم

SELECT SERVERPROPERTY('COLLATION')

تحقق من ترتيب نسخ قاعدة البيانات

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

التحقق من العمود ترتيب

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name

نصائح أخرى

إذا قمت بتثبيت SQL Server مع خيارات الترتيب الافتراضي، قد تجد أن الاستعلامات التالية بإرجاع نفس النتائج:

CREATE TABLE mytable 
( 
    mycolumn VARCHAR(10) 
) 
GO 

SET NOCOUNT ON 

INSERT mytable VALUES('Case') 
GO 

SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

ويمكنك تغيير الاستعلام الخاص بك عن طريق إجبار الترتيب على مستوى العمود:

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'case' 

SELECT myColumn FROM myTable  
    WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case' 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SELECT DATABASEPROPERTYEX('<database name>', 'Collation') 

وأما تغيير هذا الإعداد يمكن أن تؤثر على التطبيقات والاستفسارات SQL، وأود أن عزل هذا الاختبار أولا. من SQL Server 2000، يمكنك بسهولة تشغيل عبارة ALTER TABLE لتغيير ترتيب عمود معين، مما اضطرها إلى أن تكون حالة الأحرف. أولا، تنفيذ الاستعلام التالي لتحديد ما تحتاج إلى تغييره مرة أخرى إلى:

EXEC sp_help 'mytable' 

وينبغي أن تتضمن السجلات الثاني على المعلومات التالية، في سيناريو الافتراضي:

وCOLUMN_NAME ترتيب


وmycolumn SQL_Latin1_General_CP1_CI_AS

ومهما كانت العوائد العمود 'ترتيب'، وانت تعرف الآن ما عليك تغييره مرة أخرى إلى بعد إجراء التغيير التالي، والذي سيجبر حساسية القضية:

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE Latin1_General_CS_AS 
GO 



SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

إذا هذا مسامير الامور، يمكنك تغييره مرة أخرى، وذلك ببساطة عن طريق إصدار بيان ALTER TABLE الجديد (تأكد ليحل محل بلدي معرف COLLATE مع واحد هل وجدت سابقا):

ALTER TABLE mytable 
    ALTER COLUMN mycolumn VARCHAR(10) 
    COLLATE SQL_Latin1_General_CP1_CI_AS 

إذا كنت عالقة مع SQL Server 7.0، يمكنك أن تجرب هذا الحل، والتي قد تكون أكثر قليلا من ضربة الأداء (يجب عليك فقط الحصول على نتيجة للمباراة الأولى):

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10)) 

SELECT mycolumn FROM mytable WHERE 
    mycolumn = 'case' AND 
    CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10)) 

-- if myColumn has an index, you will likely benefit by adding 
-- AND myColumn = 'case' 

SQL server يحدد حالة الحساسية COLLATION.

COLLATION يمكن تعيين على مختلف المستويات.

  1. على مستوى الخادم
  2. على مستوى قاعدة البيانات
  3. مستوى العمود
  4. التعبير على مستوى

هنا هو MSDN المرجعية.

يمكن للمرء أن تحقق COLLATION في كل مستوى كما ذكر في راج أكثر من إجابة.

تحقق من ترتيب ملقم

SELECT SERVERPROPERTY('COLLATION')

تحقق من ترتيب نسخ قاعدة البيانات

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

التحقق من العمود ترتيب

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name

التحقق من التعبير الترتيب

على مستوى التعبير COLLATION كنت بحاجة الى ان ننظر في التعبير.:)

سيكون عموما في نهاية التعبير كما في المثال أدناه.

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;

ترتيب الوصف

للحصول على وصف كل COLLATION قيمة هذه محاولة.

SELECT * FROM fn_helpcollations()

و يجب أن نرى شيئا مثل هذا.

enter image description here

يمكنك دائما وضع WHERE شرط أن تصفية انظر الوصف فقط الخاص بك COLLATION.

يمكنك العثور على قائمة الترتيب هنا.

كنت ترغب في جمع.هل يمكن بناء شيء على أساس هذا مقتطف:

SELECT DATABASEPROPERTYEX('master', 'Collation');

التحديث
على أساس تحرير الخاص بك — إذا @test و @TEST يمكن في أي وقت الرجوع إلى اثنين من المتغيرات المختلفة ، ليس SQL Server.إذا كنت ترى مشاكل فيها نفس المتغير لا تساوي نفسها ، تحقق مما إذا كان هذا المتغير هو NULL, لأن NULL = NULL يعود `كاذبة.

وأفضل طريقة للعمل مع الجداول التي تم إنشاؤها بالفعل هو أنه، الذهاب إلى SQL Server استعلام محرر

ونوع: sp_help <tablename>

وهذا سوف تظهر بنية الجدول، والاطلاع على تفاصيل الحقل المطلوب تحت عمود COLLATE.

واكتب في الاستعلام مثل:

SELECT myColumn FROM myTable  
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'

وكان من الممكن أن تكون مختلفة مخطط الطابع <SQL_Latin1_General_CP1_CI_AS>، لذلك أفضل لمعرفة المخطط المحدد الذي تم استخدامه ضد هذا العمود.

<اقتباس فقرة>   

وكيف يمكنني التحقق لمعرفة ما إذا كانت قاعدة بيانات في SQL Server لحالة الأحرف؟

ويمكنك استخدام أدناه الاستعلام التي تقوم بإرجاع قاعدة البيانات الخاصة بك واعية حساسة لحالة الأحرف أو لا أو هو في نوع ثنائي (مع نتيجة فارغة):

;WITH collations AS (
    SELECT 
        name,
        CASE 
            WHEN description like '%case-insensitive%' THEN 0 
            WHEN description like '%case-sensitive%' THEN 1 
        END isCaseSensitive
    FROM 
        sys.fn_helpcollations()
)
SELECT *
FROM collations
WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));

لأكثر قراءة هذا MSDN المعلومات ؛)

وSQL Server ليست القضية الحساسة. SELECT * FROM SomeTable هو نفس SeLeCT * frOM soMetaBLe.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top