الخطأ MySQL: مواصفات المفتاح بدون طول مفتاح




mysql-error-1170 (7)

أيضا ، إذا كنت ترغب في استخدام الفهرس في هذا الحقل ، يجب عليك استخدام محرك التخزين MyISAM ونوع الفهرس FULLTEXT.

لدي جدول مع مفتاح أساسي وهو varchar (255). ظهرت بعض الحالات حيث 255 حرفًا غير كافية. حاولت تغيير الحقل إلى نص ، لكني أتلقى الخطأ التالي:

BLOB/TEXT column 'message_id' used in key specification without a key length

كيف يمكنني اصلاح هذا؟

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


إضافة varChar (255) عمود آخر (مع الافتراضي كسلسلة فارغة لا فارغة) لاحتواء تجاوز السعة عند 255 حرف ليست كافية ، وتغيير هذا PK لاستخدام كل من الأعمدة. هذا لا يبدو وكأنه مخطط قاعدة بيانات مصممة بشكل جيد ، وأنا أوصي الحصول على نموذج البيانات للنظر في ما لديك بهدف إعادة بيعها لمزيد من التطبيع.


حدث الخطأ لأن MySQL يمكن فهرسة أول N char من عمود BLOB أو TEXT . لذا يحدث الخطأ بشكل أساسي عندما يكون هناك نوع حقل / عمود من TEXT أو BLOB أو تلك التي تنتمي إلى أنواع TEXT أو BLOB مثل MEDIUMTEXT و LONGTEXT و LONGTEXT و LONGTEXT و LONGTEXT و LONGTEXT التي تحاول عمل مفتاح أو فهرس أساسي. مع BLOB أو TEXT كامل بدون قيمة الطول ، MySQL غير قادر على ضمان تفرد العمود كما هو متغير ومتغير الحجم الديناميكي. لذلك ، عند استخدام أنواع BLOB أو TEXT كمؤشر ، يجب توفير قيمة N بحيث يمكن لـ MySQL تحديد طول المفتاح. ومع ذلك ، لا تدعم MySQL حد طول رئيسي على TEXT أو BLOB . لن يعمل TEXT(88) ببساطة.

سينبثق الخطأ أيضًا عند محاولة تحويل عمود جدول من نوع non-TEXT non-BLOB مثل VARCHAR و ENUM إلى TEXT أو BLOB ، مع تعريف العمود بالفعل على أنه قيود أو فهرسة فريدة. سوف تفشل الأمر Alter Table SQL.

الحل للمشكلة هو إزالة عمود TEXT أو BLOB من الفهرس أو القيد الفريد أو تعيين حقل آخر كمفتاح أساسي. إذا لم تتمكن من القيام بذلك ، وتريد وضع حد على عمود TEXT أو BLOB ، فحاول استخدام نوع VARCHAR ووضع حد له. بشكل افتراضي ، تقتصر VARCHAR على 255 حرفًا كحد أقصى ويجب تحديد حدها ضمنًا ضمن قوس مباشرة بعد الإعلان ، أي أن VARCHAR(200) سيقتصر على 200 حرف فقط.

في بعض الأحيان ، على الرغم من عدم استخدام نوع TEXT أو BLOB ذات الصلة في الجدول الخاص بك ، قد يظهر الخطأ 1170 أيضًا. يحدث ذلك في موقف مثل عندما تقوم بتحديد عمود VARCHAR كمفتاح أساسي ، ولكن يتم بشكل خاطئ تعيين حجمه أو طوله. لا يقبل VARCHAR إلا ما يصل إلى 256 حرفًا ، لذا فإن أي شيء مثل VARCHAR(512) سيجبر MySQL على تحويل VARCHAR(512) إلى نوع بيانات SMALLTEXT ، والذي يفشل لاحقًا مع الخطأ 1170 على طول المفتاح إذا تم استخدام العمود كطريقة أساسية مفتاح أو فهرس فريد أو غير فريد. لحل هذه المشكلة ، حدد رقمًا أقل من 256 حجمًا لحقل VARCHAR .

المرجع: خطأ في الخلية 1170 (42000): عمود BLOB / TEXT يستخدم في مواصفات المفاتيح بدون طول المفتاح


طريقة أخرى ممتازة للتعامل مع هذا هو إنشاء حقل TEXT الخاص بك دون القيد الفريد وإضافة حقل VARCHAR شقيق فريد من نوعه ويحتوي على ملخص (MD5 ، SHA1 ، الخ) من حقل TEXT. قم بحساب الخلاصة وحفظها على حقل TEXT بأكمله عند إدراج حقل TEXT أو تحديثه ، ثم يكون لديك قيد فريد على حقل TEXT بأكمله (بدلاً من جزء رئيسي) الذي يمكن البحث عنه بسرعة.


ليس لديك قيم طويلة كمفتاح أساسي. هذا سوف يدمر أدائك. راجع دليل mysql ، القسم 13.6.13 "InnoDB ضبط الأداء واستكشاف الأخطاء وإصلاحها".

بدلاً من ذلك ، يكون مفتاح int بديل مثل الأولية (مع auto_increment) ، ومفتاح loong الخاص بك كـ UNIQUE ثانوي.


يجب عليك تحديد الجزء الرئيسي من عمود TEXT الذي تريد فهرسته.

لدى InnoDB قيود على 768 بايت لكل مفتاح فهرس ولن تتمكن من إنشاء فهرس أطول من ذلك.

هذا سوف يعمل بشكل جيد:

CREATE TABLE t_length (
      mydata TEXT NOT NULL,
      KEY ix_length_mydata (mydata(255)))
    ENGINE=InnoDB;

لاحظ أن الحد الأقصى لقيمة حجم المفتاح يعتمد على ترميز العمود. إنها عبارة عن 767 حرفًا لحرف أحادية البايت مثل LATIN1 و 255 حرفًا فقط لـ UTF8 (تستخدم MySQL BMP فقط والتي تتطلب 3 بايت كحدٍ أقصى لكل حرف)

إذا كنت بحاجة إلى عمود كامل ليكون PRIMARY KEY ، قم بحساب SHA1 أو MD5 hash PRIMARY KEY .


alter table authors ADD UNIQUE(name_first(767), name_second(767));

ملحوظة : 767 هو عدد الأحرف المسموح به والتي ستقوم MySQL بفهرسة الأعمدة أثناء التعامل مع فهارس blob / text

المرجع: http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html





mysql-error-1170