سؤال

لدي جدول (جدول موجود به بيانات) ويحتوي هذا الجدول على عمود اسم المستخدم.أريد أن يكون اسم المستخدم هذا فريدًا.لذلك أقوم بإضافة قيد مثل هذا:

ALTER TABLE Users 
ADD CONSTRAINT [IX_UniqueUserUserName] UNIQUE NONCLUSTERED ([UserName])

الآن أستمر في الحصول على الخطأ المتمثل في وجود مستخدمين مكررين في هذا الجدول.لكنني قمت بفحص قاعدة البيانات باستخدام الاستعلام التالي:

SELECT COUNT(UserId) as NumberOfUsers, UserName 
FROM Users 
GROUP BY UserName, UserId 
ORDER BY UserName

ينتج عن هذا قائمة بالمستخدمين الذين لديهم جميعًا الرقم 1 كـ NumberOfUsers.لذلك لا التكرارات هناك.لكن عندما أتحقق من اسم المستخدم الذي فشل فيه أرى النتيجة التالية:

beluga
béluga

لذا فمن الواضح أنه فشل في مقارنة "e" و"é" أو "è" ...يبدو الأمر كما لو أنه يتجاهل هذه العلامات، هل هناك أي طريقة بحيث لا يتجاهل SQL هذه العلامات عند إضافة قيد المفتاح الفريد.

حل:

شكرا لكم يا رفاق لقد وجدت الحل.هذا حل المشكلة:

ALTER TABLE Users 
ALTER COLUMN UserName nvarchar(250) COLLATE SQL_Latin1_General_CP1_CI_AS
هل كانت مفيدة؟

المحلول

من المرجح أن يتجاهل الترتيب الذي تستخدمه حالة الأحرف واللهجات عند المقارنة.سوف تحتاج إلى تغيير الترتيب.

  • Latin1_General_CI_AI يتجاهل حالة الأحرف واللهجات
  • Latin1_General_CI_AS لن نتجاهل اللهجات

قائمة بأسماء ترتيب خادم SQL هنا.

نصائح أخرى

والجماعات الاستعلام الخاص بك عن طريق معرف المستخدم أيضا - كنت لا تريد أن تفعل ذلك

استخدم:

SELECT COUNT(*) as NumberOfUsers, UserName 
    FROM Users 
    GROUP BY UserName 
    ORDER BY UserName

واستفسارك عن أن تظهر فقط للمستخدمين بنفس الاسم والرقم المستخدم نفسه. أو، ربما، أن تأمر البيانات بواسطة COUNT(*) ذلك هو على الأرجح الصف الأخير الذي يظهر المشاكس؟

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

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

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

وتغيير الترتيب من الحقول إلى UTF8_unicode_ci و أنه يجب أن نرى لهجات بشكل صحيح.

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

يمكنك إنشاء جدول جديد مع الترتيب الجديد، ثم نسخ * من الجدول الموجود في واحدة جديدة.

لاحظ أيضا أنه يمكنك أيضا إنشاء مجرد طاولة كنت مهتما في الترتيب relevent عن (بدلا من الخادم واسعة). حتى انك يمكن أيضا أن تفعل شيئا مثل:

CREATE TABLE Users (c1 varchar (10), .., COLLATE Latin1_General_CI_AS NULL )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top