# 1071 - নির্দিষ্ট কীটি দীর্ঘ ছিল; সর্বাধিক কী দৈর্ঘ্য 767 বাইট


562

যখন আমি নিম্নলিখিত কমান্ডটি কার্যকর করি:

ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);

আমি এই ত্রুটি বার্তা পেয়েছি:

#1071 - Specified key was too long; max key length is 767 bytes

কলাম 1 এবং কলাম 2 সম্পর্কিত তথ্য:

column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci

আমি মনে করি varchar(20)কেবল 21 বাইট varchar(500)প্রয়োজন যখন কেবল 501 বাইট প্রয়োজন। সুতরাং মোট বাইটগুলি 522, 767 এর চেয়ে কম So তবে কেন আমি ত্রুটির বার্তাটি পেয়েছি?

#1071 - Specified key was too long; max key length is 767 bytes

5
কারণ এটি 520 বাইট নয়, বরং 2080 বাইট, যা 767 বাইটের বেশি রয়েছে, আপনি কলাম 1 বর্ণচর্চা (20) এবং কলাম 2 বর্ণচর (170) করতে পারেন। আপনি যদি কোনও অক্ষর / বাইট সমতুল্য চান তবে
ল্যাটিন 1

3
আমি মনে করি আপনার গণনা এখানে কিছুটা ভুল। মাইএসকিএল মানগুলির দৈর্ঘ্য রেকর্ড করতে 1 বা 2 অতিরিক্ত বাইট ব্যবহার করে: কলামের সর্বাধিক দৈর্ঘ্য 255 বাইট বা তার চেয়ে কম হলে 2 বাইট, যদি এটি 255 বাইটের চেয়ে দীর্ঘ হয়। utf8_general_ci এনকোডিংয়ের চরিত্র অনুযায়ী 3 বাইট প্রয়োজন তাই বর্ণচর (20) 61 বাইট ব্যবহার করে, বর্ণচর (500)
1515

3
mysql> তথ্য_সেমি.কম্যাকার_সেটস থেকে ম্যাক্সেলেন, চরিত্র_সেট_নাম নির্বাচন করুন যেখানে অক্ষর_সেট_নেম ('লাতিন 1', 'utf8', 'utf8mb4'); ম্যাক্সেলেন | চরিত্র_সেট_নাম ------ | ------------------- 1 | লাতিন 1 ------ | ------------------- 3 | utf8 ------ | ------------------- 4 | utf8mb4
অভাবনীয় 10

15
'আপনি যদি কোনও অক্ষর / বাইট সমতুল্য চান তবে ল্যাটিন 1 ব্যবহার করুন' দয়া করে এটি করবেন না । লাতিন 1 সত্যিই, সত্যিই স্তন্যপান। আপনি এই জন্য আফসোস হবে।
স্টিজন ডি উইট

পড়ুন stackoverflow.com/a/52778785/2137210 সমাধান জন্য
প্রতীক

উত্তর:


490

মাইএসকিউএল সংস্করণ 5.6 (এবং পূর্ববর্তী সংস্করণ) এ ইনোডিবি টেবিলগুলির জন্য 767 বাইট হ'ল উপসর্গের সীমাবদ্ধতা । এটি মাইআইএসএএম টেবিলগুলির জন্য 1,000 বাইট দীর্ঘ। মাইএসকিউএল সংস্করণে 5.7 এবং তারপরের দিকে এই সীমাটি 3072 বাইটে বাড়ানো হয়েছে।

আপনাকে এও সচেতন হতে হবে যে আপনি যদি একটি বড় চর বা ভারচর ফিল্ডে utf8mb4 এনকোডযুক্ত একটি সূচক সেট করেন তবে আপনাকে 191 এর ফলস্বরূপ সর্বাধিক সূচক উপসর্গের দৈর্ঘ্যটি 767 বাইট (বা 3072 বাইট) 4 দ্বারা বিভক্ত করতে হবে because একটি utf8mb4 অক্ষরের সর্বোচ্চ দৈর্ঘ্য চার বাইট four একটি utf8 চরিত্রের জন্য এটি তিনটি বাইট হবে যার ফলশ্রুতি সর্বোচ্চ সূচক 254 হবে।

আপনার কাছে একটি বিকল্প হ'ল আপনার ভ্রচারের ক্ষেত্রে কেবলমাত্র সীমাবদ্ধতা রাখা place

আর একটি বিকল্প ( এই ইস্যুটির প্রতিক্রিয়া অনুসারে ) পুরো পরিমাণের চেয়ে কলামের সাবসেট পাওয়া, অর্থাত:

ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );

আপনার আবেদন করার কী কী দরকার আছে তা নিয়ে টুইঙ্ক করুন, তবে আমি অবাক হয়েছি যে এই সত্তা সম্পর্কিত আপনার ডেটা মডেলটি পর্যালোচনা করা কি উপযুক্ত হবে কিনা তা দেখার জন্য যদি মাইএসকিউএল সীমাবদ্ধতা না আঘাত করে লক্ষ্যযুক্ত ব্যবসায়ের নিয়মগুলি কার্যকর করতে আপনাকে সহায়তা করে।


4
সম্পূর্ণ পরিমাণের চেয়ে কলামের সাবসেট নির্দিষ্ট করে প্রয়োগ করতে। একটি ভাল সমাধান।
স্টিভেন

204
দৈর্ঘ্যের সীমার নীচে ক্ষেত্রগুলি কেন দৈর্ঘ্যের সীমা অতিক্রম করছে তা এটি ব্যাখ্যা করে না ...
সেরিন

6
আমি উপরে তথ্যের উপর সম্পাদনা করার চেষ্টা করেছি যে চেরিন উপরে অনুপস্থিত, যা অন্যদের দ্বারা স্পষ্টতই অনুপস্থিত হিসাবে বিবেচিত হয়েছিল, তবে এটি একটি মন্তব্য হিসাবে বেশি উপযুক্ত বলে প্রত্যাখাত হয়েছে। যারা বুঝতে চেষ্টা করছেন তাদের জন্য কেন 500 + 20> 767 জুলিয়ানের উত্তর সম্পর্কে স্টিফান এন্ড্রুলিসের মন্তব্য দেখুন।
লেটারিয়ান

8
এটি একটি সমস্যা হতে পারে। উদাহরণস্বরূপ: আমার ক্ষেত্রের নাম (255) আছে এবং আমি নামটি (191) এ এই ক্ষেত্রটির সাথে অনন্য যুক্ত করব কারণ আমি utf8mb4 ব্যবহার করছি। যদি আমার ব্যবহারকারীরা তাদের নামটি 'IJUE3ump5fiUuCi16jSofYS234MLschWiwsIttKiBrTPOTKBK6Vteh5pNuz1tKjy ... aO500MLJs' এর সাথে যুক্ত করেন এবং অন্য ব্যবহারকারীটি এই নামটি 'IJU3ump5FUCC134J4153303153153153153153153153153153153153453453453153453453453453453453453453453453153153153153153153153153153153153153153153153153456453456453456453456453453453453453453453453453453453453453453453453453453453453453453453453453453453453453453453607303453453607153153454 এটি সদৃশ এন্ট্রি আটকে না বৈধতা পাস করা উচিত।
ভি

28
সূচক সীমা 767 বাইট , অক্ষর নয়। এবং যেহেতু মাইএসকিএল-এর utf8mb4চরিত্র সেট (যা বিশ্বে বাকিরা ইউটিএফ ৮ বলে) এর জন্য (সর্বোচ্চ সর্বাধিক) চারটি বাইটের চরিত্রের প্রয়োজন হয় আপনি কেবল ইনডেক্স করতে পারেন VARCHAR(191)। মাইএসকিএল-এর utf8চরিত্রের সেটটি (যা বিশ্বজুড়ে ভাঙা বলে ডাকে) প্রতি চরিত্রের জন্য সর্বাধিক 3 বাইটের প্রয়োজন হয় তাই যদি আপনি এটি ব্যবহার করেন (যা আপনার উচিত নয় ), আপনি সূচকটি করতে পারেনVARCHAR(255)
স্টিজন ডি উইট

403

আইএনএনওডিবি / ইউটিএফ -8 নিয়ে যদি কারও সমস্যা UNIQUEহয় তবে কোনও VARCHAR(256)ক্ষেত্রটিতে একটি সূচক রাখার চেষ্টা করছে , এটিকে স্যুইচ করুন VARCHAR(255)। দেখে মনে হচ্ছে 255 এর সীমাবদ্ধতা।


246
অনুমোদিত অক্ষরের সংখ্যা কেবল আপনার অক্ষর সেট উপর নির্ভর করে। ইউটিএফ 8 অক্ষর প্রতি 3 বাইট, 4 বাইট অবধি ইউটিএফ 8 এমবি 4 এবং ল্যাটিন 1 কেবল 1 বাইট ব্যবহার করতে পারে। সুতরাং utf8 এর জন্য আপনার মূল দৈর্ঘ্য 255 টি অক্ষরের মধ্যে সীমাবদ্ধ 3*255 = 765 < 767
স্টিফান এন্ড্রুলিস

9
এটি আমাকে অনেক হতাশার হাত থেকে বাঁচিয়েছে - ধন্যবাদ you এটি গ্রহণযোগ্য উত্তর আইএমও হওয়া উচিত, ব্যবহারকারীরা 7DB বি সীমাবদ্ধতায় আঘাত হানার দাবি করে ইনোডিবি ব্যবহার করছে hit
TheCarver

8
এএস স্টেফান এন্ড্রুলিস জানিয়েছেন, এটি চরসেটের উপর নির্ভর করে। আপনি যদি ইউটিএফ 8 ব্যবহার করেন যা 3 বাইট ব্যবহার করে: 255x3 = 765 যা 767 সীমা থেকে কম, যখন 256x3 = 768 যা বেশি। তবে আপনি যদি ইউটিএফ 8 এমবি 4 এর 255 * 4 = 1020 ব্যবহার করেন তবে এটি কোনও বাস্তব সমাধান নয়
বার্নহার্ধ

25
এই উত্তরটি সঠিক। তবে যদি 255 সত্যিই আপনার জন্য কাজ করে তবে এর অর্থ হ'ল আপনি মাইএসকিএল ব্যবহার করছেন utf8যা দুর্ভাগ্যক্রমে ভেঙে গেছে। এটি কেবলমাত্র মৌলিক বহুভাষিক বিমানে অক্ষরগুলি এনকোড করতে পারে। অক্ষরগুলির বাইরে যাওয়ার সাথে আপনি সমস্যাগুলি পেয়ে যাবেন। উদাহরণস্বরূপ যে ইমোজি চরিত্রগুলি তারা যুক্ত করেছে এটির বাইরে পড়ে মনে করি। সুতরাং স্যুইচ করার পরিবর্তে VARCHAR(255)স্যুইচ করুন VARCHAR(191) এবং এনকোডিংটিতে স্যুইচ করুন utf8mb4(যা আসলে কেবল utf8, তবে মাইএসকিউএল পিছনে রাখতে চেয়েছিল। কমপ্যাট)।
স্টিজন ডি উইট

1
আমার মাল্টিকালম অনন্য সীমাবদ্ধতার জন্য সহায়ক নয়। এটি ওপি'র বহুবিধ কমনীয় সীমাবদ্ধতার জন্যও কাজ করবে না। (এটি মোট 825 বাইটের আকার দেবে)
বেরেট

351

আপনি যখন সীমা আঘাত। নিম্নলিখিত সেট করুন।

  • InnoDB utf8 VARCHAR(255)
  • InnoDB utf8mb4 VARCHAR(191)

34
এটি সেরা উত্তর। সরল, সোজা বিন্দুতে এবং এতে utf8mb4সীমাও অন্তর্ভুক্ত থাকে (যা ইমোমিস / ইত্যাদি গ্রহণ করে নতুন ডেটাবেসের জন্য সর্বাধিক ব্যবহৃত এনকোডিং)।
ক্লাদিও হল্যান্ডা

10
কারণ 767/4 ~ = 191, এবং 767/3 ~ = 255
হিসাবরক্ষক

11
কোথায় এবং কিভাবে এটি সেট করতে?
দিনেশ সানি

1
হ্যাঁ, বিবৃতিটির ENGINE=InnoDB DEFAULT CHARSET=utf8শেষে উল্লেখ করে CREATE TABLEআমি একটি VARCHAR(255)প্রাথমিক কী পেতে সক্ষম হয়েছি । ধন্যবাদ।
xonya

1
কেউ তাকে +1 সীমা অতিক্রম করতে +1 দিতে :) :)
ক্যাগকাক

147

মাইএসকিউএল স্ট্রিংয়ে অক্ষর প্রতি বাইটের সংখ্যার জন্য সবচেয়ে খারাপ পরিস্থিতি গ্রহণ করে। মাইএসকিউএল 'utf8' এনকোডিংয়ের জন্য, অক্ষর প্রতি 3 বাইট যেহেতু যে এনকোডিং অক্ষরকে অতিক্রম করতে দেয় না U+FFFF। মাইএসকিউএল 'utf8mb4' এনকোডিংয়ের জন্য এটি চরিত্র অনুসারে 4 বাইট, যেহেতু মাইএসকিউএলকে আসল ইউটিএফ -8 বলে।

সুতরাং ধরে নিয়ে আপনি 'utf8' ব্যবহার করছেন, আপনার প্রথম কলামে সূচির 60 বাইট এবং আপনার দ্বিতীয়টি 1500 নেবে।


4
- যার সম্ভবত এটির অর্থ হ'ল utf8mb4 ব্যবহার করার সময়, আমি তাদের 191 * 4 = 764 <767 হিসাবে (সর্বাধিক) 191 এ সেট করতে হবে
আইজাক

2
@ আইসাক হ্যাঁ, ঠিক,
মরগানওয়াহাল

2
আমি মনে করি এটি সঠিক উত্তর হতে পারে তবে এই জাতীয় সমস্যা সংশোধন করার জন্য কারও কি প্রয়োজন হবে তা আপনি কী ব্যাখ্যা করতে পারেন? কমপক্ষে আমার মতো মাইএসকিউএল নুবসের জন্য?
অ্যাডাম গ্রান্ট

এই সূচক সীমাটি অতিক্রম করার কোনও উপায় নেই। এখানে প্রশ্নটি অনন্য প্রতিবন্ধকতা সম্পর্কে; তাদের জন্য আপনার সীমাহীন দৈর্ঘ্যের পাঠ্যের একটি কলাম এবং অন্য একটি যেখানে আপনি সেই পাঠ্যের একটি হ্যাশ (MD5 এর মতো) সঞ্চয় করতে পারেন এবং আপনার অনন্য সীমাবদ্ধতার জন্য হ্যাশ কলামটি ব্যবহার করতে পারেন। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার প্রোগ্রামটি পাঠ্য পরিবর্তন করলে হ্যাশগুলি আপ টু ডেট রাখে, তবে খুব ঝামেলা ছাড়াই এটি পরিচালনা করার বিভিন্ন উপায় রয়েছে। একদম সত্যি বলতে, মাইএসকিউএলকে নিজেই এই জাতীয় জিনিসটি প্রয়োগ করা উচিত যাতে আপনার দরকার নেই; মারিয়াডিবির অন্তর্নির্মিত মতো কিছু থাকলে আমি অবাক হব না।
মরগানওয়াহাল

খুব দীর্ঘ ভার্চর কলামে একটি অনন্য সূচি বিরল। আপনার এটি কেন প্রয়োজন তা ভেবে দেখুন কারণ এটি কোনও ডিজাইনের সমস্যা হতে পারে। আপনি যদি অনুসন্ধানের জন্য কেবল এটিতে একটি সূচক চান, তবে কিছু 'কীওয়ার্ড' ক্ষেত্র বিবেচনা করুন যা ১৯১ টি অক্ষরের মধ্যে খাপ খায় বা সংক্ষিপ্ত বিবরণ এবং দীর্ঘ / সম্পূর্ণ পাঠ্যগুলিতে পাঠ্যকে বিভক্ত করে দেয় বা যদি আপনার সত্যিই সম্পূর্ণ পাঠ্য অনুসন্ধানের প্রয়োজন হয় তবে বিশেষত সফ্টওয়্যার ব্যবহারের জন্য বিবেচনা করুন এটি, যেমন অ্যাপাচি লুসিন।
স্টিজন ডি উইট

56

আপনার প্রশ্নের আগে এই ক্যোয়ারী চালান:

SET @@global.innodb_large_prefix = 1;

এটি সীমা বাড়িয়ে তুলবে 3072 bytes


4
বিশ্বব্যাপী ইনোডাব_লাজ_প্রিফিক্সে পরিবর্তনের কোনও নেতিবাচক কি আছে? এবং এটি কি ডিবি "গ্লোবাল" বা সমস্ত ডিবি সম্পূর্ণরূপে বিশ্বব্যাপী?
SciPhi

5
অ-মানক সারি বিন্যাসগুলি ব্যবহার করার সময় কেবলমাত্র প্রযোজ্য। Dev.mysql.com/doc/refman/5.5/en/… দেখুন । বিশেষত, 'ডায়নামিক এবং সংক্ষেপিত সারি বিন্যাসগুলি ব্যবহার করে এমন InnoDB সারণীগুলির জন্য, 767 বাইট (3072 বাইট অবধি) এর চেয়ে বেশি সূচী কী উপসর্গগুলিকে অনুমতি দেওয়ার জন্য এই বিকল্পটি সক্ষম করুন' ' ডিফল্ট সারি বিন্যাসটি প্রভাবিত নয়।
ক্রিস শিখুন

5
এটি আমার পক্ষে ভাল কাজ করেছে - আরও বিশদ এবং একটি গাইড এখানে পাওয়া যাবে: mechanics.flite.com/blog/2014/07/29/…
cwd

1
এর পরে কি আমাদের মাইএসকিএল সার্ভারটি পুনরায় চালু করতে হবে?
সিম্পলগুই

7
এই উত্তর থেকে গুরুত্বপূর্ণ অনুপস্থিত বিশদ। innodb_file_formatঅবশ্যই হতে হবে BARRACUDAএবং টেবিল স্তরে আপনাকে ব্যবহার করতে হবে ROW_FORMAT=DYNAMICবা ROW_FORMAT=COMPRESSED। গাইডের সাথে উপরের উপরে সিডব্লিউডির মন্তব্য দেখুন।
q0rban

46

লারাভেল ফ্রেমওয়ার্কের জন্য সমাধান

হিসাবে প্রতি Laravel 5.4 * ডকুমেন্টেশন। ; ফাইলের bootপদ্ধতির অভ্যন্তরে আপনাকে ডিফল্ট স্ট্রিংয়ের দৈর্ঘ্যটি নীচে সেট করতে হবে app/Providers/AppServiceProvider.php:

use Illuminate\Support\Facades\Schema;

public function boot() 
{
    Schema::defaultStringLength(191); 
}

লারাভেল 5.4 দ্বারা প্রদত্ত এই ফিক্সটির ব্যাখ্যা * * ডকুমেন্টেশন :

লারাভেল utf8mb4ডিফল্টরূপে নির্ধারিত অক্ষরটি ব্যবহার করে , যা ডাটাবেসে "ইমোজিস" সংরক্ষণের জন্য সমর্থন অন্তর্ভুক্ত করে। আপনি যদি মাইএসকিউএলের একটি সংস্করণ 5.7.7 রিলিজের চেয়ে পুরানো বা 10.2.2 রিলিজের চেয়ে পুরানো মারিয়াডিবি থেকে চালাচ্ছেন তবে মাইএসকিউএলের জন্য সূচী তৈরি করতে আপনাকে মাইগ্রেশন দ্বারা উত্পন্ন ডিফল্ট স্ট্রিং দৈর্ঘ্যটি ম্যানুয়ালি কনফিগার করতে হবে। আপনি নিজের মধ্যে Schema::defaultStringLengthপদ্ধতিটি কল করে এটি কনফিগার করতে পারেন AppServiceProvider

বিকল্পভাবে, আপনি innodb_large_prefixআপনার ডাটাবেসের জন্য বিকল্পটি সক্ষম করতে পারেন । এই বিকল্পটি কীভাবে সঠিকভাবে সক্ষম করতে হবে তার নির্দেশাবলীর জন্য আপনার ডাটাবেসের ডকুমেন্টেশন দেখুন to


10
@ বুজনপেটকভিক ভাল আমি লারাভেল ইস্যু থেকে এসেছি এবং এই উত্তরটি আমার সমস্যাটি সমাধান করেছে।
mkmnstr

এই উত্তর দুর্দান্ত। কিন্তু কেউ জানেন কি, কেন এই কাজ করে?
ইউলিডিশওয়ার্ট

1
@ ববি লারাভেল ডকুমেন্টেশন "সূচী দৈর্ঘ্য এবং মাইএসকিউএল / মারিয়াডিবি" লারাভেল ডটকম
আলী শওকত

1
@ ববি আমি উত্তর আপডেট করেছি। আমি এই ফিক্সটির জন্য লারাভেল ডকুমেন্টেশন দ্বারা প্রদত্ত ব্যাখ্যা যুক্ত করেছি।
আলী শওকত

39

আপনি কোন চরিত্রের এনকোডিং ব্যবহার করছেন? কিছু অক্ষর সেট (যেমন ইউটিএফ -16, এবং cetera) প্রতি চরিত্রে একাধিক বাইট ব্যবহার করে।


8
এটি যদি ইউটিএফ 8 হয় তবে একটি অক্ষর 4 বাইট পর্যন্ত ব্যবহার করতে পারে, যাতে 20 টি অক্ষর কলামটি 20 * 4 + 1বাইট হয় এবং 500 চর কলামটি 500 * 4 + 2বাইট হয়
থানাটোস

5
এটির মূল্যের জন্য, আমার ঠিক একই সমস্যা ছিল এবং utf8_general_ci থেকে utf8_unicode_ci এ স্যুইচ করা আমার জন্য সমস্যাটি সমাধান করে। যদিও আমি জানি না :(
Andresch Serj

11
VARCHAR(256)একটি UNIQUEসূচী সহ একটি কলামের জন্য , কোলেশন পরিবর্তন করা আমার পক্ষে কোনও প্রভাব ফেলেনি, যেমন এটি @ অ্যান্ড্রেস-এর জন্য হয়েছিল। যাইহোক, দৈর্ঘ্য 256 থেকে 255 হ্রাস করে এটি সমাধান করেছে। আমি বুঝতে পারছি না কেন, চরিত্র অনুসারে 767 / সর্বোচ্চ 4 বাইট সর্বোচ্চ 191 উপার্জন করবে?
আরজান

10
255*3 = 765; 256*3 = 768। দেখা যাচ্ছে যে আপনার সার্ভারটি চরিত্র অনুসারে 3 বাইট ধরেছে, @ আরজান
অ্যাম্বার

21
@ গ্রেগ: আপনি সঠিক, তবে এটি বিশদভাবে বর্ণনা করা উচিত: ইউটিএফ -8 নিজেই কোড পয়েন্টে 1–4 বাইট ব্যবহার করে। মাইএসকিউএলের "চরিত্রের সেটগুলি" (সত্যই এনকোডিংস) "ইউটিএফ -8 " নামে একটি অক্ষর সেট রয়েছে যা কিছু ইউটিএফ -8 এনকোড করতে সক্ষম হয় এবং কোড পয়েন্ট অনুসারে 1 by3 বাইট ব্যবহার করে এবং বিএমপির বাইরে এনকোডিং কোড পয়েন্টগুলিতে অক্ষম। এটিতে "utf8mb4" নামে আরও একটি অক্ষর সেট অন্তর্ভুক্ত রয়েছে, যা কোড পয়েন্ট অনুসারে 1–4 বাইট ব্যবহার করে এবং সমস্ত ইউনিকোড কোড পয়েন্টকে এনকোডিং করতে সক্ষম। (utf8mb4 হ'ল ইউটিএফ -8, ইউটিএফ 8 ইউটিএফ -8 এর একটি অদ্ভুত সংস্করণ))
থানাটোস

28

আমি মনে করি বর্ণচর (20) কেবলমাত্র 21 বাইট প্রয়োজন যখন ভারচর (500) কেবল 501 বাইট প্রয়োজন। সুতরাং মোট বাইটগুলি 522, 767 এর চেয়ে কম So তবে কেন আমি ত্রুটির বার্তাটি পেয়েছি?

ইউটিএফ 8 এর স্ট্রিংটি সংরক্ষণ করতে প্রতি অক্ষর 3 বাইট প্রয়োজন , তাই আপনার ক্ষেত্রে 20 + 500 অক্ষর = 20 * 3 + 500 * 3 = 1560 বাইট যা অনুমোদিত 676767 বাইটের বেশি

UTF8 এর সীমা 767/3 = 255 টি অক্ষর , UTF8mb4 এর জন্য যা চরিত্রের জন্য 4 বাইট ব্যবহার করে এটি 767/4 = 191 অক্ষর।


সীমাটির চেয়ে দীর্ঘতর কলামটি ব্যবহার করতে হলে এই সমস্যার দুটি সমাধান রয়েছে:

  1. "সস্তা" এনকোডিং ব্যবহার করুন (যেটি চরিত্র অনুযায়ী কম বাইট প্রয়োজন)
    আমার ক্ষেত্রে, আমাকে নিবন্ধের এসইও স্ট্রিং সম্বলিত কলামে অনন্য সূচি যুক্ত করতে হবে, কারণ আমি [A-z0-9\-]এসইওর জন্য কেবলমাত্র অক্ষর ব্যবহার করি, আমি ব্যবহার করেছি latin1_general_ciযা প্রতিটি চরিত্রের জন্য কেবল একটি বাইট ব্যবহার করে এবং সুতরাং কলামের দৈর্ঘ্য 767 বাইট হতে পারে।
  2. আপনার কলাম থেকে হ্যাশ তৈরি করুন এবং কেবলমাত্র অনন্য সূচি ব্যবহার করুন
    আমার জন্য অন্য বিকল্পটি ছিল অন্য একটি কলাম তৈরি করা যা এসইওর হ্যাশ সংরক্ষণ করবে, UNIQUEএসইও মানগুলি অনন্য কিনা তা নিশ্চিত করার জন্য এই কলামটির কী থাকবে । আমি KEYতাত্পর্য বাড়ানোর জন্য মূল এসইও কলামে সূচিও যুক্ত করব index

এই কৌশলটি। আমার বারচার (256) ছিল এবং আমার এটি পরিবর্তন করতে হবে (250)।
মারআমার

25

আপনি কেন ত্রুটি বার্তা পাবেন সে সম্পর্কে ইতিমধ্যে অনেক ব্যবহারকারী ইতিমধ্যে উত্তরটি দিয়েছিলেন। আমার উত্তরটি ঠিক করা এবং এটি যেমন ব্যবহার করা যায় সে সম্পর্কে use

এই লিঙ্কটি থেকে দেখুন ।

  1. মাইএসকিউএল ক্লায়েন্ট (বা মারিয়াডিবি ক্লায়েন্ট) খুলুন। এটি একটি কমান্ড লাইন সরঞ্জাম।
  2. এটি আপনার পাসওয়ার্ড জিজ্ঞাসা করবে, আপনার সঠিক পাসওয়ার্ড লিখবে।
  3. এই কমান্ডটি ব্যবহার করে আপনার ডাটাবেসটি নির্বাচন করুন use my_database_name;

ডাটাবেস পরিবর্তিত হয়েছে

  1. set global innodb_large_prefix=on;

অনুসন্ধান ঠিক আছে, 0 টি সারি প্রভাবিত (0.00 সেকেন্ড)

  1. set global innodb_file_format=Barracuda;

অনুসন্ধান ঠিক আছে, 0 টি সারি প্রভাবিত (0.02 সেকেন্ড)

  1. পিএইচপিএমআইএডমিনে আপনার ডাটাবেসে বা সহজ ব্যবস্থাপনার জন্য এমন কোনও কিছুতে যান। > ডাটাবেস নির্বাচন করুন> টেবিলের কাঠামো দেখুন > অপারেশন ট্যাবে যান । > পরিবর্তন ROW_FORMAT করার গতিশীল এবং পরিবর্তনগুলি সংরক্ষণ করুন।
  2. টেবিলের কাঠামো ট্যাবে যান > ইউনিক বোতামে ক্লিক করুন ।
  3. সম্পন্ন. এখন এটির কোনও ত্রুটি থাকা উচিত নয়।

এই ফিক্সের সমস্যাটি হ'ল যদি আপনি অন্য সার্ভারে ডিবি রফতানি করেন (উদাহরণস্বরূপ লোকালহোস্ট থেকে রিয়েল হোস্টে) এবং আপনি সেই সার্ভারে মাইএসকিউএল কমান্ড লাইন ব্যবহার করতে পারবেন না। আপনি এটি সেখানে কাজ করতে পারবেন না।


উপরের ক্যোয়ারীটি প্রবেশের পরেও যদি আপনি ত্রুটি থেকে থাকেন তবে "phpmyadmin"> আপনার পছন্দের সাথে "কোলেশন" সেট করার চেষ্টা করুন (আমার জন্য আমি "utf8_general_ci" ব্যবহার করি)> প্রয়োগ ক্লিক করুন (এমনকি এটি ইতিমধ্যে utf8 হলেও)
অ্যান্টনি কাল

আমি আপনার নির্দেশাবলীর সাথে কাজ করে এমন একটি সরঞ্জাম ব্যবহার করছি না, তবে সমস্যাটি ঠিক করার ক্ষেত্রে লোকদের সাহায্য করার চেষ্টা করার জন্য আমি এখনও এটি দিয়েছি । সমস্যাটির কারণ কী তা নিয়ে অফুরন্ত ব্যাখ্যা রয়েছে তবে কীভাবে এটি সমাধান করা যায় তা সম্পর্কে খুব কম।
টেকিন

20
Specified key was too long; max key length is 767 bytes

আপনি এই বার্তাটি পেয়েছেন কারণ 1 অক্ষর 1 অক্ষরের সমান হয় যদি আপনি latin-1অক্ষর সেটটি ব্যবহার করেন । আপনি যদি ব্যবহার করেন তবে utf8আপনার কী কলামটি সংজ্ঞায়িত করার সময় প্রতিটি অক্ষর 3 বাইট হিসাবে বিবেচিত হবে। আপনি যদি ব্যবহার করেন utf8mb4, আপনার কী কলামটি সংজ্ঞায়িত করার সময় প্রতিটি অক্ষর 4 বাইট হিসাবে বিবেচিত হবে। সুতরাং, কী ক্ষেত্রটি অনুমতি দেওয়ার চেষ্টা করছে এমন বাইটের সংখ্যা নির্ধারণ করতে আপনাকে আপনার কী ক্ষেত্রের চরিত্রের সীমাটি 1, 3, বা 4 দ্বারা (আমার উদাহরণে) দ্বারা গুন করতে হবে। আপনি যদি uft8mb4 ব্যবহার করে থাকেন তবে আপনি কেবল নেটিভ, ইনোডিবি, প্রাথমিক কী ক্ষেত্রের জন্য 191 টি অক্ষর নির্ধারণ করতে পারেন। কেবল 767 বাইট লঙ্ঘন করবেন না।


16

আপনি দীর্ঘ কলামগুলির এমডি 5 এর একটি কলাম যুক্ত করতে পারেন


নোট করুন যে এটি আপনাকে এই কলামগুলিতে ব্যাপ্তি স্ক্যান করতে দেয় না। ভ্যাচারআরগুলিতে উপসর্গের দৈর্ঘ্য আপনাকে সূচকগুলিতে (এবং স্ক্যানিং এবং সরিয়ে দেওয়ার জন্য সারি সন্ধান) এটির বৈশিষ্ট্য বজায় রাখার অনুমতি দেয় (গ্রহণযোগ্য উত্তর দেখুন)। (এটি মূলত একটি ম্যানুয়ালি প্রয়োগ করা হ্যাশ সূচক, যা দুর্ভাগ্যক্রমে মাইকিউএসএল InnoDB টেবিলগুলি সমর্থন করে না))
থানাটোস

আমি উপসর্গ সূচকগুলি ব্যবহার করতে পারিনি কারণ পরীক্ষার উদ্দেশ্যে আমার H2 এর সাথে সামঞ্জস্য বজায় রাখা দরকার ছিল এবং একটি হ্যাশ কলাম ব্যবহার করে ভাল কাজ করেছে। দূষিত ব্যবহারকারীদের সংঘর্ষ সৃষ্টি থেকে রক্ষা করতে আমি MD5 এর পরিবর্তে SHA1 এর মতো সংঘর্ষ প্রতিরোধী ফাংশন ব্যবহার করার দৃ strongly় পরামর্শ দিচ্ছি । কোনও সূচক সংঘর্ষ তথ্য ফাঁস করার জন্য ব্যবহার করা যেতে পারে যদি আপনার কোনও প্রশ্নের মধ্যে কেবল হ্যাশ মানটি পরীক্ষা করা হয়, এবং সম্পূর্ণ কলামের মান নয়।
লিটল মাইক

16

আপনার আমদানি ফাইলের utf8mb4সাথে প্রতিস্থাপন utf8করুন।

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


কেন একজনকে ঠিক এমনটি করা উচিত? অধিকন্তু, যদি এর কোনও ডাউনসাইড থাকে (যা আমি ধরে নিই) তবে আপনার এটি উল্লেখ করা উচিত
নিকো হাজেস

13

Utf8mb4 ব্যবহার করে একটি VARCHAR (255) ক্ষেত্রে একটি অনন্য সূচক যুক্ত করার চেষ্টা করার সময় আমরা এই সমস্যার মুখোমুখি হয়েছি। যদিও সমস্যাটি ইতিমধ্যে এখানে ভালভাবে বর্ণিত হয়েছে, আমরা কীভাবে এটি সমাধান করেছি এবং এর সমাধান করেছি তার জন্য আমি কিছু ব্যবহারিক পরামর্শ যুক্ত করতে চেয়েছিলাম।

Utf8mb4 ব্যবহার করার সময়, অক্ষরগুলি 4 বাইট হিসাবে গণনা করা হয়, যেখানে utf8 এর অধীনে তারা 3 বাইট হিসাবে থাকতে পারে। ইনোডিবি ডাটাবেসের একটি সীমা রয়েছে যা সূচকগুলিতে কেবল 767 বাইট থাকতে পারে। সুতরাং utf8 ব্যবহার করার সময়, আপনি 255 টি অক্ষর (767/3 = 255) সঞ্চয় করতে পারেন তবে utf8mb4 ব্যবহার করে আপনি কেবল 191 টি অক্ষর (767/4 = 191) সঞ্চয় করতে পারেন।

আপনি VARCHAR(255)utf8mb4 ব্যবহার করে ক্ষেত্রগুলির জন্য নিয়মিত সূচকগুলি যুক্ত করতে একেবারেই সক্ষম , তবে কী হয় সূচকের আকারটি স্বয়ংক্রিয়ভাবে ১৯১ টি অক্ষরে ছিন্ন হয়ে যায় - unique_keyএখানে যেমন :

সিকুয়েল প্রো স্ক্রিনশটটি সূচিটি 191 টি অক্ষরে ছাঁটা হয়েছে showing

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

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

দিনের শেষে, আপনি যদি কোনও ক্ষেত্রে একটি অনন্য সূচি রাখতে চান, তবে ক্ষেত্রের পুরো বিষয়বস্তু অবশ্যই সূচকে মাপসই করা উচিত। Utf8mb4 এর জন্য, এর অর্থ আপনার ভিচারার ফিল্ডের দৈর্ঘ্য 191 টি অক্ষর বা তারও কম হবে। যদি আপনার এই টেবিল বা ক্ষেত্রের জন্য utf8mb4 এর প্রয়োজন না হয় তবে আপনি এটিকে utf8 এ ফেলে দিতে পারেন এবং আপনার 255 দৈর্ঘ্যের ক্ষেত্র রাখতে সক্ষম হতে পারেন।


11

আমার মূল উত্তরটি এখানে:

আমি সবেমাত্র ডাটাবেস ফেলেছি এবং এটি পুনরায় তৈরি করি এবং ত্রুটিটি চলে যায়:

drop database if exists rhodes; create database rhodes default CHARACTER set utf8 default COLLATE utf8_general_ci;

তবে, এটি সমস্ত ক্ষেত্রে কার্যকর হয় না।

এটি বর্ণের কলামগুলিতে অক্ষর সেট utf8(বা utf8mb4) সহ বর্ণের কলামগুলির সাথে নির্দিষ্ট দৈর্ঘ্যের চেয়ে বেশি অক্ষরের সাথে সূচকগুলি ব্যবহার করার সমস্যা । ক্ষেত্রে utf8mb4, যে নির্দিষ্ট দৈর্ঘ্য 191।

আরো তথ্যের জন্য এই প্রবন্ধে লং ইনডেক্স অধ্যায় পড়ুন দয়া করে কিভাবে মাইএসকিউএল ডাটাবেসের মধ্যে দীর্ঘ ইনডেক্স ব্যবহার করার জন্য: http://hanoian.com/content/index.php/24-automate-the-converting-a-mysql-database- চরিত্র সেট-টু-utf8mb4


ওপেনমিটিংস সেটআপের জন্য সমস্যার সমাধান করুন (বিটিডাব্লু আপনি আমার রাতটি সংরক্ষণ করেছেন :-)
লুডো

11

5 কর্মক্ষেত্র:

সীমাটি 5.7.7 এ বাড়ানো হয়েছিল (মারিয়াডিবি 10.2.2?)। এবং এটি 5.6 (10.1) তে কিছু কাজ করে বাড়ানো যেতে পারে।

আপনি যদি অক্ষর সেটটি utf8mb4 ব্যবহার করার চেষ্টা করার কারণে সীমাটি হিট করছেন। তারপরে ত্রুটিটি এড়াতে নিম্নলিখিতগুলির মধ্যে একটি (প্রতিটিটির একটি অপূর্ণতা রয়েছে) করুন:

  Upgrade to 5.7.7 for 3072 byte limit -- your cloud may not provide this;
  Change 255 to 191 on the VARCHAR -- you lose any values longer than 191 characters (unlikely?);
  ALTER .. CONVERT TO utf8 -- you lose Emoji and some of Chinese;
  Use a "prefix" index -- you lose some of the performance benefits.
  Or... Stay with older version but perform 4 steps to raise the limit to 3072 bytes:

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_large_prefix=1;
logout & login (to get the global values);
ALTER TABLE tbl ROW_FORMAT=DYNAMIC;  -- (or COMPRESSED)

- http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes


10

আমি এই সমস্যাটি এর সাথে স্থির করেছি:

varchar(200) 

সঙ্গে প্রতিস্থাপিত

varchar(191)

200 টিরও বেশি সংখ্যক বর্ণালী তাদের 191 এ প্রতিস্থাপন করে বা পাঠ্য সেট করে।


এটি আমার জন্যও কাজ করেছিল। আমার একটি ভার্চার (250) ছিল, তবে ডেটা এত দীর্ঘ ছিল না। এটি পরিবর্তন করে (100)। ধারণার জন্য ধন্যবাদ :)
অরুণ বাসিল লাল

7

আমি এই বিষয়টিতে কিছু অনুসন্ধান করেছি অবশেষে কিছু কাস্টম পরিবর্তন পেয়েছি

মাইএসকিউএল ওয়ার্কবেঞ্চের জন্য For.৩..7 সংস্করণ গ্রাফিকাল আন্তঃপর্ব উপলব্ধ

  1. ওয়ার্কবেঞ্চ শুরু করুন এবং সংযোগটি নির্বাচন করুন।
  2. পরিচালনা বা ইনস্ট্যান্স এ যান এবং বিকল্প ফাইল নির্বাচন করুন।
  3. যদি ওয়ার্কব্যাঞ্চ আপনাকে কনফিগারেশন ফাইলটি পড়ার অনুমতি জিজ্ঞাসা করে এবং তারপরে দু'বার ওকে চাপ দিয়ে অনুমতি দিন।
  4. কেন্দ্রে জায়গায় প্রশাসক অপশন ফাইল উইন্ডো আসে।
  5. InnoDB ট্যাবে যান এবং ইনেনোডবি_লাজ_প্রিফিক্সটি যদি সাধারণ বিভাগে পরীক্ষা না করা হয় তবে তা পরীক্ষা করে দেখুন।
  6. DYNAMIC এ ইনোডোবি_ডিফল্ট_রো_ফর্ম্যাট অপশন মান সেট করুন।

6.3.7 এর নীচের সংস্করণগুলির জন্য সরাসরি বিকল্পগুলি উপলভ্য নয় সুতরাং কমান্ড প্রম্পট সহ প্রয়োজন with

  1. প্রশাসক হিসাবে সিএমডি শুরু করুন।
  2. ডিরেক্টরটিতে যান যেখানে মাইএসকিএল সার্ভার ইনস্টল করা হয় তার বেশিরভাগ ক্ষেত্রে এটি "সি: \ প্রোগ্রাম ফাইলস \ মাইএসকিউএল \ মাইএসকিউএল সার্ভার ৫.7 \ বিন" তাই কমান্ডটি "সিডি \" "সিডি প্রোগ্রাম ফাইলগুলি \ মাইএসকিউএল \ মাইএসকিউএল সার্ভার ৫.7 \ বিন" হয়।
  3. এখন কমান্ড মাইএসকিএল-ইউ ব্যবহারকারীর নাম-পি ডাটাবেসশীম চালান এখন এটি সংশ্লিষ্ট ব্যবহারকারীর পাসওয়ার্ড চেয়েছিল। পাসওয়ার্ড সরবরাহ করুন এবং mysql প্রম্পটে প্রবেশ করুন।
  4. আমাদের নীচের কমান্ডগুলিতে একের পর এক সেট করে বিশ্বব্যাপী সেটিংস সেট করতে হবে গ্লোবাল ইনোডব_লাজ_প্রিফিক্স = অন; গ্লোবাল ইন্নাডব_ফিল_ফর্ম্যাট = ব্যারাকুডা সেট করুন; গ্লোবাল ইনোডব_ফিল_পিটার_ট্যাবল সেট করুন = সত্য;
  5. এখন শেষ অবধি আমাদের ডিফল্টরূপে প্রয়োজনীয় টেবিলের ROW_FORMAT পরিবর্তন করতে হবে এর কমপ্যাক্ট আমাদের এটি DYNAMIC এ সেট করতে হবে।
  6. টেবিলের টেবিলের নাম টেবিলের নাম পরিবর্তন করুন: ROW_FORMAT = DYNAMIC;
  7. সম্পন্ন

আমি এটি খুঁজে পাচ্ছি না: 6.. DYNAMIC এ ইনেডোড_ডিফল্ট_রো_ ফর্ম্যাট বিকল্প মান সেট করুন।
অ্যাড্রিয়ান সিড

যদি আমি ব্যবহার set global innodb_default_row_format = DYNAMIC;করি আমি এই বার্তাটি দেখতে পেয়েছি: ERROR 1193 (HY000): অজানা সিস্টেম ভেরিয়েবল 'ইনোডাব_ডিফাল্ট_রো_ফর্ম্যাট'
অ্যাড্রিয়ান সিড

আপনি কীভাবে ওয়ার্কব্যাঞ্চ থেকে সেন্টিমিডি ত্রুটি পেয়েছেন? আমি এটি ওয়ার্কবেঞ্চ থেকে করেছি এটির সরাসরি বিকল্প রয়েছে।
অভিষেক

আমি এটি সিএমডি থেকে করি কারণ আমি ওয়ার্কবেঞ্চে বিকল্পটি দেখতে পাচ্ছি না
অ্যাড্রিয়ান সিড

1
আমি দেখতে পেয়েছি যে সমস্যাটি এই ভার্সটি v5.7.9 এ প্রবর্তিত হয়েছিল এবং আমার v5.6.33 সংস্করণ রয়েছে, ধন্যবাদ
অ্যাড্রিয়ান সিড

7

লারাভেল 5.7 থেকে 6.0 এর জন্য

অনুসরণ করার পদক্ষেপগুলি

  1. যাও App\Providers\AppServiceProvider.php
  2. use Illuminate\Support\Facades\Schema;এটি শীর্ষে সরবরাহকারীতে যুক্ত করুন ।
  3. বুট ফাংশনের ভিতরে এটি যুক্ত করুন Schema::defaultStringLength(191);

সব, উপভোগ।


লারাভেল ৫.৮ এর জন্যও কাজ করেছেন।
নিও

এটি একটি খারাপ সমাধান। কারণ: সূচকগুলি অনন্তকালীন নয় long আপনি যখন কোনও কিছুর জন্য একটি অনন্য সূচক প্রয়োগ করেন, আপনি চান সূচকটি বেশিরভাগ সময় স্থির করে রাখে। তার মানে আপনি করা উচিত নয় মতো তৈরি করবেনemail , তবে আপনার ইমেলটি হ্যাশ করা উচিত এবং এটিকে অনন্য করা উচিত। কাঁচা স্ট্রিং-ডেটার বিপরীতে, হ্যাশগুলি নির্দিষ্ট প্রস্থ হয় এবং সমস্যাগুলি ছাড়াই সূচিযুক্ত এবং অনন্য করা যায়। সমস্যাটি বোঝার পরিবর্তে, আপনি এমন ভয়ঙ্কর অভ্যাসগুলি ছড়িয়ে দিচ্ছেন যা স্কেল হয় না।
এনবি

5

আপনার জোট পরিবর্তন করুন। আপনি utf8_general_ci ব্যবহার করতে পারেন যা প্রায় সকলকে সমর্থন করে


"প্রায়" এটি একটি দীর্ঘমেয়াদী সমাধান নয় যে বেশ ভাল ইঙ্গিত
নিকো হাজেস

4

সারণী তৈরি utf8mb4করার utf8সময় কেবলমাত্র পরিবর্তন করা আমার সমস্যার সমাধান করেছে। যেমন: CREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;to CREATE TABLE ... DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


4

এটি ঠিক করার জন্য, এটি আমার জন্য কবজির মতো কাজ করে।

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;

আমি নিশ্চিত করেছিলাম যে আমার সমস্যাটিও ছিল ডেটাবেস কোলেশন। এর জন্য আমার কোনও ব্যাখ্যা নেই। আমি মাইএসকিএল v5.6.32 ব্যবহার করি এবং ডিবি কোলেশনটি ছিল utf8mb4_unicode_ci।
mahiard

2

নীচে প্রদত্ত কলামের উপর ভিত্তি করে, এই 2 টি ভেরিয়েবল স্ট্রিং কলামগুলি ব্যবহার করছে utf8_general_ciকোলেশন ( utf8চারসেটটি অন্তর্ভুক্ত)

মাইএসকিউএলে, utf8চরসেট প্রতিটি চরিত্রের জন্য সর্বাধিক 3 বাইট ব্যবহার করে। সুতরাং, এটির জন্য 500 * 3 = 1500 বাইট বরাদ্দ করা দরকার যা মাইএসকিউএল অনুমতি দেয় 676767 বাইটের চেয়ে অনেক বেশি। এজন্য আপনি এই 1071 ত্রুটি পাচ্ছেন।

অন্য কথায়, চরসেটের বাইট উপস্থাপনার উপর ভিত্তি করে আপনাকে অক্ষর গণনা গণনা করতে হবে কারণ প্রতিটি চরসেটই একক বাইট উপস্থাপনা নয় (যেমনটি আপনি অনুমান করেছেন।) utf8মাইএসকিউএল-তে আইই চরিত্রের জন্য সর্বাধিক 3-বাইট ব্যবহার করা হয়, 767 / 3≈255 অক্ষর, এবং জন্যutf8mb4 একটি সর্বাধিক 4-বাইট উপস্থাপনা, 767 / 4≈191 টি অক্ষর।

এটি মাইএসকিউএল নামেও পরিচিত

column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci

1

আমি এই ক্যোয়ারিকে সর্বাধিক দৈর্ঘ্যের লঙ্ঘন করে এমন কোন কলামে সূচি দিয়েছে তা সনাক্ত করতে দরকারী বলে মনে করেছি:

SELECT
  c.TABLE_NAME As TableName,
  c.COLUMN_NAME AS ColumnName,
  c.DATA_TYPE AS DataType,
  c.CHARACTER_MAXIMUM_LENGTH AS ColumnLength,
  s.INDEX_NAME AS IndexName
FROM information_schema.COLUMNS AS c
INNER JOIN information_schema.statistics AS s
  ON s.table_name = c.TABLE_NAME
 AND s.COLUMN_NAME = c.COLUMN_NAME 
WHERE c.TABLE_SCHEMA = DATABASE()
  AND c.CHARACTER_MAXIMUM_LENGTH > 191 
  AND c.DATA_TYPE IN ('char', 'varchar', 'text')

1

দয়া করে চেক করুন যদি sql_modeভালো হয়

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

যদি তা হয় তবে পরিবর্তন করুন

sql_mode=NO_ENGINE_SUBSTITUTION

অথবা

আপনার মাই সিএনএফ ফাইল পরিবর্তন করে আপনার সার্ভারটি পুনরায় চালু করুন (নিম্নলিখিতটি প্রয়োগ করা হচ্ছে)

innodb_large_prefix=on

1

আমার ক্ষেত্রে, আমি লিনাক্স পুনর্নির্দেশ আউটপুট / ইনপুট অক্ষর ব্যবহার করে একটি ডাটাবেস ব্যাকআপ করার সময় আমার এই সমস্যা হয়েছিল। সুতরাং, আমি নীচের বর্ণিত হিসাবে সিনট্যাক্স পরিবর্তন। পিএস: একটি লিনাক্স বা ম্যাক টার্মিনাল ব্যবহার করে।

ব্যাকআপ (> পুনঃনির্দেশ ছাড়াই)

# mysqldump -u root -p databasename -r bkp.sql

পুনরুদ্ধার করুন (<পুনর্নির্দেশ ছাড়াই)

# mysql -u root -p --default-character-set=utf8 databasename
mysql> SET names 'utf8'
mysql> SOURCE bkp.sql

"নির্দিষ্ট কীটি ত্রুটিটি দীর্ঘ;


1

সূচকের দৈর্ঘ্য এবং মাইএসকিউএল / মারিয়াডিবি


লারাভেল ডিফল্টরূপে সেট করা utf8mb4 অক্ষর ব্যবহার করে , যার মধ্যে ডাটাবেসে "ইমোজিস" সংরক্ষণের জন্য সমর্থন অন্তর্ভুক্ত রয়েছে । আপনি যদি মাইএসকিউএলের একটি সংস্করণ 5.7.7 রিলিজের চেয়ে পুরানো বা 10.2.2 রিলিজের চেয়ে পুরানো মারিয়াডিবি থেকে চালাচ্ছেন তবে মাইএসকিউএলের জন্য সূচী তৈরি করতে আপনাকে মাইগ্রেশন দ্বারা উত্পন্ন ডিফল্ট স্ট্রিং দৈর্ঘ্যটি ম্যানুয়ালি কনফিগার করতে হবে। আপনি আপনার অ্যাপ্লিকেশন পরিষেবা প্রদানকারীতে স্কিমা :: ডিফল্ট স্ট্রিংলংথ পদ্ধতিটি কল করে এটি কনফিগার করতে পারেন :

use Illuminate\Support\Facades\Schema;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191);
}

বিকল্পভাবে, আপনি আপনার ডাটাবেসের জন্য ইনেডোড_লাজ_প্রিফিক্স বিকল্পটি সক্ষম করতে পারেন। এই বিকল্পটি কীভাবে সঠিকভাবে সক্ষম করতে হবে তার নির্দেশাবলীর জন্য আপনার ডাটাবেসের ডকুমেন্টেশন দেখুন to

ব্লগ থেকে রেফারেন্স: https://www.scratchcode.io/specified-key-too-long-error-in-laravel/

অফিসিয়াল লারাভেল ডকুমেন্টেশন থেকে রেফারেন্স: https://laravel.com/docs/5.7/ ইমিগ্রেশন


0

আপনি যদি এমন কিছু তৈরি করে থাকেন:

CREATE TABLE IF NOT EXISTS your_table (
  id int(7) UNSIGNED NOT NULL AUTO_INCREMENT,
  name varchar(256) COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY name (name)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ROW_FORMAT=FIXED;

এটা কিছু হতে হবে

CREATE TABLE IF NOT EXISTS your_table (
      id int(7) UNSIGNED NOT NULL AUTO_INCREMENT,
      name varchar(256) COLLATE utf8mb4_bin NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ROW_FORMAT=FIXED;

তবে আপনাকে কোড থেকে এই কলামটির স্বাতন্ত্র্য পরীক্ষা করতে হবে বা বারচার কলামের MD5 বা SHA1 হিসাবে একটি নতুন কলাম যুক্ত করতে হবে


3
তারপরে আপনার অনন্য কীটি হারিয়ে গেল। আমার মনে হয় আরও ভাল উপায় হ'ল নামটির দৈর্ঘ্য কমিয়ে 191 করা হবে
44

1
দেশীয় ডিবি বৈশিষ্ট্যটি কেন প্রোগ্রামিয়ালি স্বতন্ত্রতার জন্য পরীক্ষা করবেন?
পাওয়ে টমকিয়েল

0

উপসর্গ সীমাবদ্ধতার কারণে এই ত্রুটি ঘটবে। 67.7 এর আগে মাইএসকিউএল সংস্করণগুলিতে ইনোডিবি সারণির জন্য 76767 বাইট হ'ল উপসর্গের সীমাবদ্ধতা। এটি মাইআইএসএএম টেবিলগুলির জন্য 1,000 বাইট দীর্ঘ। মাইএসকিউএল সংস্করণে 5.7 এবং তারপরের দিকে এই সীমাটি 3072 বাইটে বাড়ানো হয়েছে।

আপনাকে ত্রুটি দিয়ে পরিষেবাতে নিম্নলিখিতটি চালানো আপনার সমস্যার সমাধান করা উচিত। এটি এমওয়াইএসকিউএল সিএলআইতে চালাতে হবে।

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=on;
SET GLOBAL innodb_large_prefix=on;

-1

অভিযোগকারী সূচী ক্ষেত্রের অক্ষরকে "ল্যাটিন 1" তে
পরিবর্তন করুন অর্থাৎ ALTER TABLE tbl পরিবর্তন করুন মাইফিল্ড মাইফিল্ড বারচর (600) চরিত্র সেট ল্যাটিন 1 ডিফল্ট নাল;
ল্যাটিন 1 চারটির পরিবর্তে একটি চরিত্রের জন্য একটি বাইট নেয়


5
এবং যদি সে নন-ল্যাটিন 1 অক্ষর to োকানোর চেষ্টা করবে ?
পাওয়ে টমকিয়েল

4
এটি সবচেয়ে খারাপ কাজ। কখনই না।
সেবাস

1
আমার ক্ষেত্রে এটি একটি কলামে যা পথের নাম কেবলমাত্র হেক্স অক্ষর সহ সঞ্চয় করে ... তাই এটি কারও পক্ষে সমাধান হতে পারে। এটি সত্যিই আপনি কী সঞ্চয় করতে চান তার উপর নির্ভর করে ...
কোডওয়ান্ডার

আমাকে এটিকে নিম্নোক্ত করে তুলতে হয়েছিল, যেহেতু ল্যাটিন 1 ব্যবহার করা 2016 এএডি তে কোনও সমাধান নয়। 2007 সালে লাতিন 1 থেকে ইউটিএফ 8-তে কোনও ডাটাবেস রূপান্তর করার সময়টি সম্পর্কে আমার এখনও ভয়াবহ দুঃস্বপ্ন রয়েছে U সুন্দর না. মোটেই
বেট লেমড

আমি দুটি কলামে অনন্য সূচীতে একই সমস্যা ছিল যেখানে আমি বিটকয়েন ঠিকানা এবং লেনদেন আইডি সঞ্চয় করি। এগুলি সর্বদা ASCII অক্ষর হবে, সুতরাং আমি এই কলামগুলিতে ল্যাটিন 1 ব্যবহার করব। Upvoting।
অ্যালেক্স

-2

আপনি যদি innodb_log_file_sizeসম্প্রতি পরিবর্তিত হয়ে থাকেন তবে আগের মানটি যা কাজ করেছিল তা পুনরুদ্ধার করার চেষ্টা করুন।

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