# 1071 - รหัสที่ระบุยาวเกินไป ความยาวสูงสุดของคีย์คือ 767 ไบต์


562

เมื่อฉันดำเนินการคำสั่งต่อไปนี้:

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

ฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

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

ข้อมูลเกี่ยวกับ column1 และ column2:

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

ฉันคิดว่าvarchar(20)ต้องการเพียง 21 ไบต์ในขณะที่varchar(500)ต้องใช้เพียง 501 ไบต์ ดังนั้นจำนวนไบต์ทั้งหมดคือ 522 น้อยกว่า 767 ดังนั้นทำไมฉันถึงได้รับข้อความแสดงข้อผิดพลาด

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

5
เนื่องจากไม่ใช่ 520 ไบต์ แต่แทนที่จะเป็น 2080 ไบต์ซึ่งมีขนาดเกิน 767 ไบต์คุณสามารถทำคอลัมน์ 1 varchar (20) และ column2 varchar (170) หากคุณต้องการตัวละคร / ไบต์ equiv ใช้ latin1
Rahly

3
ฉันคิดว่าการคำนวณของคุณผิดเล็กน้อย mysql ใช้ 1 หรือ 2 ไบต์พิเศษในการบันทึกค่าความยาว: 1 ไบต์หากความยาวสูงสุดของคอลัมน์คือ 255 ไบต์หรือน้อยกว่า 2 ถ้ามันยาวเกิน 255 ไบต์ การเข้ารหัส utf8_general_ci ต้องการ 3 ไบต์ต่อตัวอักษรดังนั้น varchar (20) ใช้ 61 bytes, varchar (500) ใช้ 1502 bytes รวม 1,563 bytes
lackovic10 10

3
mysql> เลือก maxlen, character_set_name จาก information_schema.character_sets โดยที่ character_set_name ใน ('latin1', 'utf8', 'utf8mb4'); maxlen | character_set_name ------ | ------------------- 1 | latin1 ------ | ------------------- 3 | utf8 ------ | ------------------- 4 | utf8mb4
lackovic10

15
'ถ้าคุณต้องการตัวอักษร / ไบต์ equiv ใช้ latin1' กรุณาไม่ทำเช่นนี้ Latin1 จริงๆครับจริงๆ คุณจะต้องเสียใจกับสิ่งนี้
Stijn de Witt

อ้างถึงstackoverflow.com/a/52778785/2137210สำหรับการแก้ปัญหา
Pratik

คำตอบ:


490

767 ไบต์เป็นข้อ จำกัด คำนำหน้าที่ระบุไว้สำหรับตาราง InnoDB ใน MySQL เวอร์ชัน 5.6 (และรุ่นก่อนหน้า) มีความยาว 1,000 ไบต์สำหรับตาราง MyISAM ใน MySQL เวอร์ชั่น 5.7 ขึ้นไปขีด จำกัด นี้เพิ่มขึ้นเป็น 3072 ไบต์

คุณต้องระวังด้วยว่าหากคุณตั้งค่าดัชนีในฟิลด์ char หรือ varchar ขนาดใหญ่ซึ่งเข้ารหัส utf8mb4 คุณต้องหารความยาวส่วนนำหน้าดัชนีสูงสุด 767 ไบต์ (หรือ 3072 ไบต์) 4 โดยส่งผลให้ 191 นี่เป็นเพราะ ความยาวสูงสุดของอักขระ utf8mb4 คือสี่ไบต์ สำหรับอักขระ utf8 จะเป็นสามไบต์ทำให้มีค่าส่วนนำหน้าดัชนีสูงสุดเท่ากับ 254

ทางเลือกหนึ่งที่คุณต้องทำก็เพียงแค่วางขีด จำกัด ล่างลงในช่อง VARCHAR

ตัวเลือกอื่น (ตามการตอบสนองต่อปัญหานี้ ) คือการได้รับส่วนย่อยของคอลัมน์มากกว่าจำนวนทั้งหมดเช่น:

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

ปรับแต่งตามที่คุณจำเป็นต้องได้รับกุญแจที่จะนำไปใช้ แต่ฉันสงสัยว่ามันจะคุ้มค่าที่จะตรวจสอบรูปแบบข้อมูลของคุณเกี่ยวกับองค์กรนี้เพื่อดูว่ามีการปรับปรุงที่จะช่วยให้คุณสามารถใช้กฎเกณฑ์ทางธุรกิจ


4
เมื่อต้องการใช้โดยการระบุชุดย่อยของคอลัมน์มากกว่าจำนวนทั้งหมด ทางออกที่ดี
สตีเวน

204
นี้ไม่ได้อธิบายว่าทำไมเขตต่ำกว่าขีดจำกัดความยาวจะเกินขีด จำกัด ของความยาว ...
Cerin

6
ฉันได้ลองแก้ไขในข้อมูล @Cerin ที่หายไปด้านบนซึ่งเห็นได้ชัดว่าคนอื่นหายไปเช่นกัน แต่มันก็ถูกปฏิเสธว่าเหมาะสมกว่าความคิดเห็น สำหรับผู้ที่พยายามเข้าใจว่าทำไม 500 + 20> 767 เห็นความคิดเห็นของ Stefan Endrullis ในคำตอบของ Julien
Letharion

8
นี่อาจเป็นปัญหา ตัวอย่างเช่น: ฉันมีชื่อฟิลด์ (255) และเพิ่มเฉพาะฟิลด์นี้ที่ชื่อ (191) เนื่องจากฉันใช้ utf8mb4 หากฉันมีผู้ใช้ของฉันเพิ่มชื่อของพวกเขาด้วย 'IJUE3ump5fiUuCi16jSofYS234MLschW4WIIKIKIKKIKKIKKIVKIVKIVKIVARKI' AJO ... มันควรผ่านการตรวจสอบไม่ติดที่รายการที่ซ้ำกัน
ve

28
ขีด จำกัด ดัชนีคือ 767 ไบต์ไม่ใช่อักขระ และเนื่องจากutf8mb4ชุดอักขระของ Mysql (ซึ่งส่วนที่เหลือของโลกเรียกใช้ utf8) ต้องการ (มากที่สุด) 4 ไบต์ต่ออักขระคุณจึงสามารถจัดทำดัชนีได้สูงสุดVARCHAR(191)เท่านั้น utf8ชุดอักขระของ Mysql (ซึ่งส่วนที่เหลือของโลกเรียกร้อง) ต้องการมากที่สุด 3 ไบต์ต่อตัวอักษรดังนั้นหากคุณใช้งาน (ซึ่งคุณไม่ควรใช้ ) คุณสามารถสร้างดัชนีได้ถึงVARCHAR(255)
Stijn de Witt

404

หากใครมีปัญหาเกี่ยวกับ INNODB / UTF-8 พยายามที่จะนำUNIQUEดัชนีบนสนามสลับไปVARCHAR(256) VARCHAR(255)ดูเหมือนว่า 255 เป็นข้อ จำกัด


247
จำนวนอักขระที่อนุญาตขึ้นอยู่กับชุดอักขระของคุณ UTF8 อาจใช้อักขระสูงสุด 3 ไบต์ต่ออักขระ utf8mb4 สูงสุด 4 ไบต์และ latin1 เพียง 1 ไบต์ ดังนั้นสำหรับ utf8 ยาวที่สำคัญของคุณจะถูก จำกัด 255 3*255 = 765 < 767ตัวอักษรตั้งแต่
Stefan Endrullis

10
สิ่งนี้ช่วยให้ฉันผิดหวังมาก - ขอบคุณ ควรเป็นคำตอบที่ได้รับการยอมรับ IMO เนื่องจากผู้ใช้ใช้ InnoDB โดยอ้างว่าพวกเขามีข้อ จำกัด 767b
TheCarver

8
ดังที่ Stefan Endrullis กล่าวขึ้นอยู่กับชุดอักขระ หากคุณใช้ UTF8 ซึ่งใช้ 3 ไบต์: 255x3 = 765 ซึ่งต่ำกว่าขีด จำกัด 767 ขณะที่ 256x3 = 768 ซึ่งสูงกว่า แต่ถ้าคุณใช้ UTF8mb4 ของมัน 255 * 4 = 1,020 ดังนั้นมันจึงไม่ใช่ทางออกที่
แท้จริง

25
คำตอบนี้ถูกต้อง อย่างไรก็ตามหาก 255 ใช้งานได้จริงสำหรับคุณหมายความว่าคุณกำลังใช้ Mysql utf8ซึ่งโชคไม่ดี มันสามารถเข้ารหัสอักขระในระนาบหลายภาษาพื้นฐาน คุณจะได้รับปัญหาเกี่ยวกับตัวละครที่อยู่นอกเหนือนั้น ยกตัวอย่างเช่นตัวละครอีโมจิที่พวกเขาเพิ่มมานอกเหนือจากนั้นฉันคิดว่า ดังนั้นแทนที่จะเปลี่ยนเป็นVARCHAR(255)สลับไปที่VARCHAR(191) และเปลี่ยนการเข้ารหัสเป็นutf8mb4(ซึ่งจริง ๆ แล้วเป็นเพียง utf8 แต่ MySql ต้องการเก็บไว้กลับกัน)
Stijn de Witt

1
ไม่เป็นประโยชน์สำหรับข้อ จำกัด ที่ไม่ซ้ำหลายคอลัมน์ของฉัน มันจะไม่ทำงานสำหรับข้อ จำกัด ที่ไม่ซ้ำหลายคอลัมน์ของ OP (จะให้ขนาดรวมเป็น 825 ไบต์)
Barett

351

เมื่อคุณถึงขีด จำกัด ตั้งค่าดังต่อไปนี้

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

34
นี่คือคำตอบที่ดีที่สุด ง่ายตรงประเด็นและยังรวมถึงutf8mb4ขีด จำกัด (ซึ่งเป็นการเข้ารหัสที่ใช้มากที่สุดสำหรับฐานข้อมูลใหม่เนื่องจากมันยอมรับ emojis / etc)
Claudio Holanda

10
เพราะ 767/4 ~ = 191 และ 767/3 ~ = 255
นักบัญชีเริ่ม

11
ที่ไหนและอย่างไรที่จะตั้ง?
Dinesh Sunny

1
ใช่การระบุENGINE=InnoDB DEFAULT CHARSET=utf8ในตอนท้ายของCREATE TABLEคำสั่งที่ฉันสามารถมีVARCHAR(255)คีย์หลัก ขอบคุณ
xonya

1
มีคนให้เขา 1 จะเกินขีด จำกัด 191 :)
cagcak

147

MySQL ถือว่าตัวพิมพ์ใหญ่ที่สุดสำหรับจำนวนไบต์ต่ออักขระในสตริง สำหรับการเข้ารหัส MySQL 'utf8' นั่นคือ 3 ไบต์ต่อตัวอักษรเนื่องจากการเข้ารหัสนั้นไม่อนุญาตให้มีตัวอักษรเกินU+FFFFไบต์ต่อตัวละครตั้งแต่การเข้ารหัสที่ไม่อนุญาตให้ตัวละครเกิน สำหรับการเข้ารหัส MySQL 'utf8mb4' มันคือ 4 ไบต์ต่อตัวอักษรเพราะนั่นคือสิ่งที่ MySQL เรียก UTF-8 จริง

สมมติว่าคุณใช้ 'utf8' คอลัมน์แรกของคุณจะใช้ดัชนี 60 ไบต์และอีกอันที่สองคือ 1500


4
- ซึ่งน่าจะหมายความว่าเมื่อใช้ utf8mb4 ฉันต้องตั้งค่าพวกเขาเป็น (สูงสุด) 191 เป็น 191 * 4 = 764 <767.
Isaac

2
@Isaac ใช่แน่นอน
morganwahl

2
ฉันคิดว่านี่อาจเป็นคำตอบที่ถูกต้อง แต่คุณสามารถอธิบายรายละเอียดเกี่ยวกับสิ่งที่เราต้องทำเพื่อแก้ไขปัญหาดังกล่าวหรือไม่? อย่างน้อยสำหรับ MySQL noobs อย่างฉันเหรอ?
Adam Grant

ไม่มีทางที่จะหลีกเลี่ยงข้อ จำกัด ดัชนีนี้ได้ คำถามที่นี่เกี่ยวกับข้อ จำกัด ที่ไม่ซ้ำกัน; สำหรับสิ่งเหล่านั้นคุณสามารถมีหนึ่งคอลัมน์ของข้อความที่มีความยาวไม่ จำกัด และคอลัมน์ที่คุณเก็บแฮช (เช่น MD5) ของข้อความนั้นและใช้คอลัมน์แฮชสำหรับข้อ จำกัด เฉพาะของคุณ คุณจะต้องตรวจสอบให้แน่ใจว่าโปรแกรมของคุณทำให้แฮชเป็นปัจจุบันอยู่เสมอเมื่อมีการเปลี่ยนแปลงข้อความ แต่มีหลายวิธีในการจัดการกับปัญหาดังกล่าวโดยไม่มีปัญหามากเกินไป ค่อนข้างตรงไปตรงมา, MySQL ควรใช้สิ่งนั้นเองดังนั้นคุณไม่จำเป็นต้อง; ฉันจะไม่แปลกใจถ้า MariaDB มีบางอย่างในตัวนั้น
morganwahl

ดัชนีที่ไม่ซ้ำกันในคอลัมน์ varchar ที่ยาวมากหายาก คิดเกี่ยวกับสาเหตุที่คุณต้องการเพราะอาจเป็นปัญหาการออกแบบ หากคุณต้องการดัชนีสำหรับการค้นหาให้พิจารณาฟิลด์ 'คำหลัก' บางอันที่มีความยาวไม่เกิน 191 ตัวอักษรหรือแบ่งข้อความเป็นคำอธิบายสั้น ๆ และข้อความยาว / สมบูรณ์ ฯลฯ หรือหากคุณต้องการค้นหาข้อความแบบเต็มพิจารณาใช้ซอฟต์แวร์พิเศษสำหรับ มันเช่น Apache Lucene
Stijn de Witt

56

เรียกใช้แบบสอบถามนี้ก่อนที่แบบสอบถามของคุณ:

SET @@global.innodb_large_prefix = 1;

3072 bytesนี้จะเพิ่มการ จำกัด


4
มีข้อเสียใด ๆ ในการเปลี่ยนเป็น innodb_large_prefix ทั่วโลก? และนั่นคือฐานข้อมูล "ทั่วโลก" หรือฐานข้อมูลทั้งหมดทั่วโลกหรือไม่
SciPhi

5
ใช้เฉพาะเมื่อใช้รูปแบบแถวที่ไม่ได้มาตรฐาน ดูdev.mysql.com/doc/refman/5.5/en/... โดยเฉพาะ 'เปิดใช้งานตัวเลือกนี้เพื่ออนุญาตคำนำหน้าคีย์ดัชนีที่ยาวกว่า 767 ไบต์ (สูงสุด 3072 ไบต์) สำหรับตาราง InnoDB ที่ใช้รูปแบบแถว DYNAMIC และ COMPRESSED' รูปแบบแถวเริ่มต้นจะไม่ได้รับผลกระทบ
Chris Lear

5
สิ่งนี้ทำงานได้ดีสำหรับฉัน - รายละเอียดเพิ่มเติมและคำแนะนำสามารถพบได้ที่นี่: mechanics.flite.com/blog/2014/07/29/…
cwd

1
เราจำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์ mysql หลังจากนี้
SimpleGuy

7
รายละเอียดที่ขาดหายไปสำคัญจากคำตอบนี้ innodb_file_formatจะต้องมีBARRACUDAและในระดับตารางที่คุณต้องใช้หรือROW_FORMAT=DYNAMIC ROW_FORMAT=COMPRESSEDดูความคิดเห็นของ @ cwd ด้านบนพร้อมคำแนะนำ
q0rban

46

โซลูชันสำหรับ Laravel Framework

ตามเอกสาร Laravel 5.4. * ; คุณต้องตั้งค่าความยาวสตริงเริ่มต้นภายในbootวิธีของapp/Providers/AppServiceProvider.phpไฟล์ดังนี้:

use Illuminate\Support\Facades\Schema;

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

คำอธิบายของการแก้ไขนี้กำหนดโดยเอกสาร Laravel 5.4. * :

Laravel ใช้utf8mb4ชุดอักขระตามค่าเริ่มต้นซึ่งรวมถึงการรองรับการจัดเก็บ "emojis" ในฐานข้อมูล หากคุณใช้งาน MySQL รุ่นเก่ากว่ารุ่น 5.7.7 หรือ MariaDB ที่เก่ากว่ารุ่น 10.2.2 คุณอาจต้องกำหนดค่าความยาวสตริงเริ่มต้นที่สร้างโดยการโอนย้ายด้วยตนเองเพื่อให้ MySQL สร้างดัชนีสำหรับพวกเขา คุณสามารถกำหนดค่านี้โดยการเรียกSchema::defaultStringLengthวิธีการภายในของคุณAppServiceProviderวิธีการภายในของคุณ

หรือคุณอาจเปิดใช้งานinnodb_large_prefixตัวเลือกสำหรับฐานข้อมูลของคุณ ดูเอกสารประกอบของฐานข้อมูลของคุณสำหรับคำแนะนำเกี่ยวกับวิธีการเปิดใช้งานตัวเลือกนี้อย่างถูกต้อง


10
@BojanPetkovic ดีฉันเพิ่งมาจากปัญหา Laravel และคำตอบนี้แก้ปัญหาของฉันได้จริง
mkmnstr

คำตอบนี้ดีมาก แต่ไม่มีใครรู้ว่าทำไมสิ่งนี้ได้ผล
UeliDeSchwert

1
เอกสาร @Bobby Laravel ให้คำอธิบายในหัวข้อ "ความยาวดัชนี & MySQL / MariaDB" laravel.com/docs/5.4/migrations#creating-indexes
Ali Shaukat

1
@ บ๊อบบี้ฉันได้อัพเดตคำตอบแล้ว ฉันได้เพิ่มคำอธิบายที่กำหนดโดยเอกสาร laravel สำหรับการแก้ไขนี้
Ali Shaukat

39

คุณใช้การเข้ารหัสอักขระอะไร ชุดอักขระบางชุด (เช่น UTF-16 และอื่น ๆ ) ใช้มากกว่าหนึ่งไบต์ต่ออักขระ


8
ถ้ามัน UTF8 อักขระสามารถใช้งานได้ถึง 4 ไบต์เพื่อให้ 20 คอลัมน์อักขระ20 * 4 + 1ไบต์และคอลัมน์ถ่าน 500 500 * 4 + 2ไบต์
ตาย

5
สำหรับสิ่งที่คุ้มค่าฉันเพิ่งมีปัญหาเดียวกันและเปลี่ยนจาก utf8_general_ci เป็น utf8_unicode_ci แก้ปัญหาให้ฉันแล้ว ฉันไม่รู้ว่าทำไม :(
Andresch Serj

11
สำหรับVARCHAR(256)คอลัมน์ที่มีUNIQUEดัชนีการเปลี่ยนการเรียงไม่มีผลกับฉันเหมือนที่ทำกับ @Andresch อย่างไรก็ตามการลดความยาวจาก 256 เหลือ 255 ก็ช่วยได้ ฉันไม่เข้าใจว่าทำไม 767 / สูงสุด 4 ไบต์ต่อตัวอักษรจะให้ได้สูงสุด 191
Arjan

10
255*3 = 765; 256*3 = 768. ดูเหมือนว่าเซิร์ฟเวอร์ของคุณกำลังสมมติ 3 ไบต์ต่อตัวอักษร @Arjan
Amber

21
@Greg: คุณถูกต้อง แต่ควรจะทำอย่างละเอียด: UTF-8 นั้นใช้ 1–4 ไบต์ต่อจุดรหัส "ชุดอักขระ" ของ MySQL (การเข้ารหัสจริงๆ) มีชุดอักขระที่เรียกว่า "utf8" ที่สามารถเข้ารหัสUTF-8 บางส่วนและใช้ 1-3 ไบต์ต่อจุดรหัสและไม่สามารถเข้ารหัสจุดรหัสนอก BMP ได้ นอกจากนี้ยังมีชุดอักขระอื่นที่เรียกว่า "utf8mb4" ซึ่งใช้ 1–4 ไบต์ต่อจุดรหัสและสามารถเข้ารหัสจุดรหัส Unicode ทั้งหมดได้ (utf8mb4 คือ UTF-8, utf8 เป็นรุ่นแปลก ๆ ของ UTF-8)
Thanatos

28

ฉันคิดว่า varchar (20) ต้องการ 21 ไบต์เท่านั้นในขณะที่ varchar (500) ต้องการเพียง 501 ไบต์เท่านั้น ดังนั้นจำนวนไบต์ทั้งหมดคือ 522 น้อยกว่า 767 ดังนั้นทำไมฉันถึงได้รับข้อความแสดงข้อผิดพลาด

UTF8 ต้องการ 3 ไบต์ต่อตัวอักษรในการจัดเก็บสตริงดังนั้นในกรณีของคุณ 20 + 500 ตัวอักษร = 20 * 3 + 500 * 3 = 1,560ไบต์ซึ่งมากกว่า767 ที่อนุญาตไบต์ที่

ขีด จำกัด สำหรับ UTF8 คือ 767/3 = 255 อักขระสำหรับ UTF8mb4 ซึ่งใช้ 4 ไบต์ต่อตัวอักษรคือ 767/4 = 191 ตัวอักษร


มีวิธีแก้ไขปัญหานี้สองวิธีหากคุณต้องการใช้คอลัมน์ที่ยาวกว่าขีด จำกัด :

  1. ใช้การเข้ารหัส "ถูกกว่า" (ที่ต้องใช้ไบต์น้อยต่อตัวอักษร)
    ในกรณีของฉันฉันต้องเพิ่มดัชนีที่ไม่ซ้ำในคอลัมน์ที่มีสตริงบทความของ SEO เนื่องจากฉันใช้[A-z0-9\-]ตัวอักษรเฉพาะสำหรับ SEO ฉันใช้latin1_general_ciซึ่งใช้เพียงหนึ่งไบต์ต่ออักขระ และคอลัมน์สามารถมีความยาว 767 ไบต์
  2. สร้างแฮชจากคอลัมน์ของคุณและใช้ดัชนีที่ไม่ซ้ำกันเท่านั้น
    ตัวเลือกอื่น ๆ สำหรับฉันคือการสร้างคอลัมน์อื่นที่จะเก็บแฮชของ SEO คอลัมน์นี้จะมีUNIQUEคีย์เพื่อให้แน่ใจว่าค่า SEO นั้นไม่ซ้ำกัน ฉันจะเพิ่มKEYดัชนีในคอลัมน์ SEO เดิมเพื่อเพิ่มความเร็วในการค้นหา

นี่เป็นการหลอกลวง ฉันมี varchar (256) และฉันต้องเปลี่ยนเป็น varchar (250)
MaRmAR

25

คำตอบเกี่ยวกับสาเหตุที่คุณได้รับข้อความแสดงข้อผิดพลาดได้รับคำตอบจากผู้ใช้หลายคนแล้วที่นี่ คำตอบของฉันคือเกี่ยวกับวิธีการแก้ไขและใช้งานตามที่เป็นอยู่

อ้างอิงจากลิงค์นี้

  1. เปิดไคลเอนต์ MySQL (หรือไคลเอนต์ MariaDB) มันเป็นเครื่องมือบรรทัดคำสั่ง
  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. ไปที่ฐานข้อมูลของคุณบน phpMyAdmin หรืออะไรทำนองนั้นเพื่อการจัดการที่ง่าย > เลือกฐานข้อมูล> ดูโครงสร้างตาราง> ไปที่แท็บปฏิบัติการ > เปลี่ยนROW_FORMATเป็นDYNAMICและบันทึกการเปลี่ยนแปลง
  2. ไปที่แท็บโครงสร้างของตาราง> คลิกที่ปุ่มที่ไม่ซ้ำกัน
  3. เสร็จสิ้น ตอนนี้มันควรจะไม่มีข้อผิดพลาด

ปัญหาของการแก้ไขนี้คือถ้าคุณส่งออก db ไปยังเซิร์ฟเวอร์อื่น (เช่นจาก localhost ไปยังโฮสต์จริง) และคุณไม่สามารถใช้บรรทัดคำสั่ง MySQL ในเซิร์ฟเวอร์นั้น คุณไม่สามารถทำให้มันทำงานที่นั่น


หากคุณยังคงมีข้อผิดพลาดหลังจากป้อนแบบสอบถามด้านบนให้ลองไปที่ "phpmyadmin"> ตั้งค่า "การจัดเรียง" ตามที่คุณต้องการ (สำหรับฉันฉันใช้ "utf8_general_ci")> คลิกใช้ (แม้ว่าจะเป็น utf8 แล้ว)
Anthony Kal

ฉันไม่ได้ใช้เครื่องมือที่ทำงานร่วมกับคำแนะนำของคุณ แต่ฉันยังคงลงคะแนนเพื่อพยายามช่วยเหลือผู้ใช้ในการแก้ไขปัญหา มีคำอธิบายที่ไม่รู้จบว่าอะไรทำให้เกิดปัญหา แต่มีน้อยมากเกี่ยวกับวิธีการแก้ปัญหาจริง
Teekin

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 ตัวสำหรับฟิลด์ InnoDB, คีย์หลักดั้งเดิม อย่าฝ่าฝืน 767 ไบต์


16

คุณสามารถเพิ่มคอลัมน์ของ md5 ของคอลัมน์ยาวได้


โปรดทราบว่าสิ่งนี้จะไม่อนุญาตให้คุณสแกนพิสัยข้ามคอลัมน์เหล่านี้ ความยาวของคำนำหน้าบน VARCHARs จะช่วยให้คุณคงคุณลักษณะนี้เอาไว้ขณะเดียวกันก็อาจทำให้การจับคู่แบบปลอมในดัชนี (และการสแกนและการค้นหาแถวเพื่อกำจัดพวกเขา) (ดูคำตอบที่ยอมรับ) (นี่คือดัชนีแฮชที่ถูกนำไปใช้งานด้วยตนเองซึ่งน่าเศร้าที่ MysQL ไม่สนับสนุนกับตาราง InnoDB)
Thanatos

ฉันไม่สามารถใช้ดัชนีคำนำหน้าได้เพราะฉันต้องการรักษาความเข้ากันได้กับ H2 เพื่อการทดสอบและพบว่าการใช้คอลัมน์แฮชทำงานได้ดี ฉันขอแนะนำอย่างยิ่งให้ใช้ฟังก์ชั่นป้องกันการชนเช่น SHA1 แทนที่จะเป็น MD5 เพื่อป้องกันผู้ใช้ที่เป็นอันตรายจากการสร้างการชน การชนกันของดัชนีอาจถูกนำไปใช้ประโยชน์กับการรั่วไหลของข้อมูลหากหนึ่งในแบบสอบถามของคุณตรวจสอบค่าแฮชไม่ใช่ค่าคอลัมน์เต็ม
Little Mike

16

แทนที่utf8mb4ด้วยutf8ในไฟล์นำเข้าของคุณ

ป้อนคำอธิบายรูปภาพที่นี่


ทำไมคนเราควรทำอย่างนั้น? นอกจากนี้หากมีข้อเสียใด ๆ (ซึ่งฉันถือว่า) คุณควรพูดถึงเรื่องนี้
Nico Haase

13

เราพบปัญหานี้เมื่อพยายามเพิ่มดัชนี UNIQUE ไปยังเขตข้อมูล VARCHAR (255) โดยใช้ utf8mb4 ในขณะที่ปัญหาได้สรุปไว้ที่นี่แล้วฉันต้องการเพิ่มคำแนะนำที่เป็นประโยชน์สำหรับวิธีที่เราคิดออกและแก้ไขมัน

เมื่อใช้ utf8mb4 อักขระจะนับเป็น 4 ไบต์ในขณะที่อยู่ภายใต้ utf8 จะสามารถเป็น 3 ไบต์ ฐานข้อมูล InnoDB มีขีด จำกัด ที่ดัชนีสามารถมีได้เพียง 767 ไบต์ ดังนั้นเมื่อใช้ utf8 คุณสามารถเก็บ 255 ตัวอักษร (767/3 = 255) แต่การใช้ utf8mb4 คุณสามารถเก็บได้เพียง 191 ตัวอักษร (767/4 = 191)

คุณสามารถเพิ่มดัชนีปกติสำหรับVARCHAR(255)ฟิลด์โดยใช้ utf8mb4 ได้ แต่สิ่งที่เกิดขึ้นคือขนาดดัชนีจะถูกตัดเหลือที่ 191 อักขระโดยอัตโนมัติ - เช่นเดียวกับunique_keyที่นี่:

ภาพหน้าจอ Sequel Pro แสดงดัชนีถูกตัดเหลือที่ 191 ตัวอักษร

สิ่งนี้ดีเพราะดัชนีปกติใช้เพื่อช่วยให้ MySQL ค้นหาข้อมูลของคุณได้เร็วขึ้น ไม่จำเป็นต้องทำดัชนีฟิลด์ทั้งหมด

ดังนั้นเหตุใด MySQL จึงตัดทอนดัชนีโดยอัตโนมัติสำหรับดัชนีปกติ แต่เกิดข้อผิดพลาดอย่างชัดเจนเมื่อพยายามทำดัชนีเฉพาะ? เพื่อให้ MySQL สามารถเข้าใจได้ว่ามีการแทรกหรืออัพเดทค่าอยู่หรือไม่นั้นจำเป็นต้องสร้างดัชนีทั้งมูลค่าและไม่ใช่เพียงส่วนหนึ่งของมัน

ในตอนท้ายของวันหากคุณต้องการมีดัชนีที่ไม่ซ้ำกันในเขตข้อมูลเนื้อหาทั้งหมดของเขตข้อมูลจะต้องพอดีกับดัชนี สำหรับ utf8mb4 หมายถึงการลดความยาวฟิลด์ VARCHAR ของคุณเป็น 191 อักขระหรือน้อยกว่า หากคุณไม่ต้องการ utf8mb4 สำหรับตารางหรือเขตข้อมูลนั้นคุณสามารถวางกลับไปที่ utf8 และสามารถเก็บฟิลด์ความยาว 255 ฟิลด์ของคุณได้


11

นี่คือคำตอบเดิมของฉัน:

ฉันเพิ่งวางฐานข้อมูลและสร้างใหม่เช่นนี้และข้อผิดพลาดหายไป:

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

อย่างไรก็ตามมันไม่สามารถใช้ได้กับทุกกรณี

เป็นปัญหาของการใช้ดัชนีในคอลัมน์ VARCHAR กับชุดอักขระutf8(หรือ utf8mb4) พร้อมกับคอลัมน์ VARCHAR ที่มีความยาวมากกว่าอักขระที่กำหนด ในกรณีของutf8mb4ความยาวนั้นคือ 191

โปรดดูส่วน Long Index ในบทความนี้สำหรับข้อมูลเพิ่มเติมวิธีใช้ดัชนีแบบยาวในฐานข้อมูล MySQL: http://hanoian.com/content/index.php/24-automate-the-converting-a-mysql-database- ตัวตั้งเพื่อ utf8mb4


แก้ปัญหาสำหรับการติดตั้ง openmeetings (BTW คุณบันทึกไว้ของฉันคืน :-)
ลูโด

11

5 วิธีแก้ไข:

ขีด จำกัด เพิ่มขึ้นใน 5.7.7 (MariaDB 10.2.2?) และสามารถเพิ่มขึ้นได้ด้วยการทำงานบางอย่างใน 5.6 (10.1)

หากคุณกดปุ่มขีด จำกัด เนื่องจากพยายามใช้ CHARACTER SET 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)

varchar ทั้งหมดที่มีมากกว่า 200 รายการแทนที่ด้วย 191 หรือตั้งเป็นข้อความ


นี่คือสิ่งที่ทำงานให้ฉันด้วย ฉันมี varchar (250) แต่ข้อมูลไม่นานขนาดนั้น เปลี่ยนเป็น varchar (100) ขอบคุณสำหรับไอเดีย :)
Arun Basil Lal

7

ในที่สุดฉันก็ทำการค้นหาในหัวข้อนี้ได้รับการเปลี่ยนแปลงที่กำหนดเอง

สำหรับ MySQL workbench 6.3.7 เวอร์ชัน Graphical inter phase สามารถใช้ได้

  1. เริ่ม Workbench และเลือกการเชื่อมต่อ
  2. ไปที่การจัดการหรืออินสแตนซ์และเลือกไฟล์ตัวเลือก
  3. ถ้า Workbench ขออนุญาตให้คุณอ่านไฟล์การกำหนดค่าจากนั้นอนุญาตโดยกดตกลงสองครั้ง
  4. ที่จุดกึ่งกลางหน้าต่างไฟล์ตัวเลือกผู้ดูแลระบบมา
  5. ไปที่แท็บ InnoDB และตรวจสอบ innodb_large_prefix หากไม่ได้ตรวจสอบในส่วนทั่วไป
  6. ตั้งค่าตัวเลือก innodb_default_row_format เป็น DYNAMIC

สำหรับรุ่นที่ต่ำกว่า 6.3.7 ตัวเลือกโดยตรงไม่สามารถใช้งานได้ดังนั้นจำเป็นต้องใช้พรอมต์คำสั่ง

  1. เริ่ม CMD ในฐานะผู้ดูแลระบบ
  2. ไปที่ผู้กำกับที่ติดตั้งเซิร์ฟเวอร์ mysql ส่วนใหญ่จะอยู่ที่ "C: \ Program Files \ MySQL \ MySQL เซิร์ฟเวอร์ 5.7 \ bin" ดังนั้นคำสั่งคือ "cd \" "cd โปรแกรม Files \ MySQL \ MySQL Server 5.7 \ bin"
  3. ตอนนี้เรียกใช้คำสั่ง mysql -u ชื่อผู้ใช้ -p ฐานข้อมูลตอนนี้มันถามรหัสผ่านของผู้ใช้ที่เกี่ยวข้อง ระบุรหัสผ่านและป้อนในพรอมต์ mysql
  4. เราต้องตั้งค่าส่วนกลางบางอย่างป้อนคำสั่งด้านล่างทีละหนึ่งชุด global innodb_large_prefix = on ตั้งค่า innodb_file_format = barracuda ทั่วโลก; ตั้งค่าส่วนกลาง innodb_file_per_table = true
  5. ตอนนี้ในที่สุดเราต้องเปลี่ยน ROW_FORMAT ของตารางที่ต้องการโดยปริยายของมันขนาดกะทัดรัดเราต้องตั้งค่าเป็น DYNAMIC
  6. ใช้คำสั่งดังต่อไปนี้แก้ไขตาราง table_name ROW_FORMAT = DYNAMIC;
  7. เสร็จสิ้น

ฉันไม่พบสิ่งนี้: 6. ตั้งค่าตัวเลือก innodb_default_row_format เป็น DYNAMIC
Adrian Cid Almaguer

ถ้าฉันใช้set global innodb_default_row_format = DYNAMIC;ฉันเห็นข้อความนี้: ข้อผิดพลาด 1193 (HY000): ตัวแปรระบบที่ไม่รู้จัก 'innodb_default_row_format'
Adrian Cid Almaguer

คุณมีข้อผิดพลาดจาก workbench ถึง cmd อย่างไร ฉันทำมันจาก workbench มันมีตัวเลือกโดยตรง
Abhishek

ฉันทำจาก CMD เพราะฉันไม่เห็นตัวเลือกใน Workbench
Adrian Cid Almaguer

1
ฉันเห็นปัญหา var นี้ถูกนำมาใช้ใน v5.7.9 และฉันมีรุ่น v5.6.33 ขอบคุณ
Adrian Cid Almaguer

7

สำหรับ laravel 5.7ถึง6.0

ขั้นตอนในการติดตาม

  1. ไปที่ App\Providers\AppServiceProvider.phpไปที่
  2. เพิ่มไปยังผู้ให้บริการ use Illuminate\Support\Facades\Schema;ด้านบน
  3. ภายในฟังก์ชั่นการบู๊ตเพิ่มสิ่งนี้ Schema::defaultStringLength(191);

สนุกได้เลย


ทำงานให้กับ Laravel 5.8 ด้วย
Neo

นี่เป็นทางออกที่ไม่ดี สาเหตุ: ดัชนีไม่ได้มีความยาวไม่สิ้นสุด เมื่อคุณใช้ดัชนีที่ไม่ซ้ำกับบางสิ่งบางอย่างคุณต้องการให้ดัชนีคงที่โดยส่วนใหญ่ นั่นหมายความว่าคุณไม่ควรทำสิ่งที่emailไม่เหมือนใคร แต่คุณควรแฮชอีเมลและทำให้เป็นหนึ่งเดียว แตกต่างจากข้อมูลสตริงดิบแฮชมีความกว้างคงที่และสามารถจัดทำดัชนีและสร้างเอกลักษณ์โดยไม่มีปัญหา แทนที่จะเข้าใจปัญหาคุณกำลังแพร่กระจายแนวปฏิบัติที่น่ากลัวซึ่งไม่ได้ปรับขนาด
NB

5

เปลี่ยนการเปรียบเทียบของคุณ คุณสามารถใช้utf8_general_ciที่รองรับได้เกือบทั้งหมด


"เกือบ" เป็นคำใบ้ที่ดีว่านี่ไม่ใช่วิธีแก้ปัญหาระยะยาว
Nico Haase

4

เพียงเปลี่ยนutf8mb4เป็นutf8เมื่อสร้างตารางแก้ปัญหาของฉัน ตัวอย่างเช่นการCREATE TABLE ... DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;CREATE TABLE ... DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


4

เพื่อแก้ไขปัญหานี้ได้ผลกับฉันเหมือนมีเสน่ห์

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;

ฉันยืนยันว่าปัญหาของฉันคือการเปรียบเทียบฐานข้อมูลด้วย ฉันไม่มีคำอธิบายใด ๆ ฉันใช้ mysql v5.6.32 และการเปรียบเทียบฐานข้อมูลคือ utf8mb4_unicode_ci
mahyard

2

ขึ้นอยู่กับคอลัมน์ที่ระบุด้านล่างคอลัมน์สตริง 2 ตัวแปรเหล่านั้นกำลังใช้การutf8_general_ciเรียง ( utf8โดยนัยคือ charset)

ใน MySQL utf8ชุดอักขระจะใช้สูงสุด3 ไบต์สำหรับอักขระแต่ละตัว ดังนั้นจึงจำเป็นต้องจัดสรร 500 * 3 = 1500 ไบต์ซึ่งมากกว่า MySQL 767 ไบต์อนุญาต นั่นเป็นเหตุผลที่คุณได้รับข้อผิดพลาด 1,071 นี้

กล่าวอีกนัยหนึ่งคุณต้องคำนวณการนับจำนวนอักขระตามการแทนค่าไบต์ของชุดอักขระเนื่องจากไม่ใช่ชุดอักขระทุกชุดเป็นการแทนค่าไบต์เดียว (ตามที่คุณสันนิษฐาน) IE utf8ใน MySQL ใช้งานได้สูงสุด 3 ไบต์ต่อตัวอักษร, 767 / 3≈255 อักขระและสำหรับutf8mb4การแทนข้อมูลแบบ 4 ไบต์สูงสุด 767/419191 ตัวอักษร

เป็นที่รู้จักกันว่า MySQL

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

หรือ

รีสตาร์ทเซิร์ฟเวอร์ของคุณเปลี่ยนไฟล์ my.cnf ของคุณ (การติดตาม)

innodb_large_prefix=on

1

ในกรณีของฉันฉันมีปัญหานี้เมื่อฉันสำรองข้อมูลฐานข้อมูลโดยใช้อักขระเอาต์พุต / อินพุตอินพุตการเปลี่ยนเส้นทางของ linux ดังนั้นฉันจะเปลี่ยนไวยากรณ์ตามที่อธิบายไว้ด้านล่าง PS: ใช้ terminal linux หรือ mac

สำรองข้อมูล (ไม่มี> การเปลี่ยนเส้นทาง)

# 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

ข้อผิดพลาด "คีย์ที่ระบุยาวเกินไปความยาวสูงสุดของคีย์คือ 767 ไบต์" ง่ายหายไป


1

ความยาวของดัชนี & MySQL / MariaDB


Laravel ใช้อักขระ utf8mb4 ที่ตั้งไว้ตามค่าเริ่มต้นซึ่งรวมถึงการรองรับการจัดเก็บ"emojis"ในฐานข้อมูล หากคุณใช้งาน MySQL รุ่นเก่ากว่ารุ่น 5.7.7 หรือ MariaDB ที่เก่ากว่ารุ่น 10.2.2 คุณอาจต้องกำหนดค่าความยาวสตริงเริ่มต้นที่สร้างโดยการโอนย้ายด้วยตนเองเพื่อให้ MySQL สร้างดัชนีสำหรับพวกเขา คุณสามารถกำหนดค่านี้ได้โดยการเรียกวิธีSchema :: defaultStringLengthภายในAppServiceProviderของคุณ:

use Illuminate\Support\Facades\Schema;

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

หรือคุณอาจเปิดใช้งานตัวเลือก innodb_large_prefix สำหรับฐานข้อมูลของคุณ ดูเอกสารประกอบของฐานข้อมูลของคุณสำหรับคำแนะนำเกี่ยวกับวิธีการเปิดใช้งานตัวเลือกนี้อย่างถูกต้อง

การอ้างอิงจากบล็อก: https://www.scratchcode.io/specified-key-too-long-error-in-laravel/

การอ้างอิงจากเอกสาร laravel อย่างเป็นทางการ: https://laravel.com/docs/5.7/migrations


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 ของคอลัมน์ varchar


3
จากนั้นคีย์เฉพาะของคุณจะหายไป ฉันคิดว่าวิธีที่ดีกว่านั้นคือลดความยาวของชื่อให้เหลือเพียง 191
2525 haudoing haudoing

1
เหตุใดจึงต้องตรวจสอบความเป็นเอกลักษณ์โดยทางโปรแกรมหากเป็นคุณลักษณะฐานข้อมูลท้องถิ่น
Paweł Tomkiel

0

เนื่องจากข้อ จำกัด ส่วนนำหน้าข้อผิดพลาดนี้จะเกิดขึ้น 767 ไบต์เป็นข้อ จำกัด คำนำหน้าที่ระบุไว้สำหรับตาราง InnoDB ในรุ่น MySQL ก่อน 5.7 มีความยาว 1,000 ไบต์สำหรับตาราง MyISAM ใน MySQL เวอร์ชั่น 5.7 ขึ้นไปขีด จำกัด นี้เพิ่มขึ้นเป็น 3072 ไบต์

การดำเนินการต่อไปนี้ในบริการที่ให้ข้อผิดพลาดแก่คุณควรแก้ไขปัญหาของคุณ สิ่งนี้จะต้องถูกเรียกใช้ใน MYSQL CLI

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

-1

เปลี่ยน CHARSET ของฟิลด์ดัชนีบ่นเป็น "latin1"
เช่นเปลี่ยนตาราง tbl เปลี่ยน myfield myfield varchar (600) ชุดอักขระ latin1 ค่าเริ่มต้น NULL;
latin1 ใช้เวลาหนึ่งไบต์สำหรับอักขระหนึ่งตัวแทนที่จะเป็นสี่ตัว


5
และถ้าเขาจะพยายามแทรกตัวอักษรที่ไม่ใช่ลาติน 1 ?
Paweł Tomkiel

4
นี่คือสิ่งที่เลวร้ายที่สุดที่จะทำ ไม่เคยทำอย่างนั้น
Sebas

1
ในกรณีของฉันมันอยู่ในคอลัมน์ที่เก็บชื่อเส้นทางที่มีอักขระฐานสิบหกเท่านั้น ... ดังนั้นนี่อาจเป็นทางออกสำหรับใครบางคน มันขึ้นอยู่กับสิ่งที่คุณต้องการเก็บ ...
2559

ฉันต้อง downvote นี้เนื่องจากการใช้ latin1 ไม่ใช่วิธีแก้ปัญหาใน 2016AD ฉันยังมีฝันร้ายที่น่ากลัวเกี่ยวกับเวลาที่เราต้องแปลงฐานข้อมูลจาก latin1 เป็น utf8 ย้อนกลับไปในปี 2550 ฮึ ไม่สวย. เลย
เดิมพันเริ่ม

ฉันมีปัญหาเดียวกันกับดัชนีเฉพาะในสองคอลัมน์ที่ฉันเก็บที่อยู่ bitcoin และรหัสธุรกรรม สิ่งเหล่านี้จะเป็นอักขระ ASCII เสมอดังนั้นฉันจะใช้ latin1 ในคอลัมน์เหล่านี้ Upvoting
alexg

-2

หากคุณมีการเปลี่ยนแปลงinnodb_log_file_sizeเมื่อเร็ว ๆ นี้ลองคืนค่าก่อนหน้าซึ่งทำงานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.