เราพบปัญหานี้เมื่อพยายามเพิ่มดัชนี 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
ที่นี่:
สิ่งนี้ดีเพราะดัชนีปกติใช้เพื่อช่วยให้ MySQL ค้นหาข้อมูลของคุณได้เร็วขึ้น ไม่จำเป็นต้องทำดัชนีฟิลด์ทั้งหมด
ดังนั้นเหตุใด MySQL จึงตัดทอนดัชนีโดยอัตโนมัติสำหรับดัชนีปกติ แต่เกิดข้อผิดพลาดอย่างชัดเจนเมื่อพยายามทำดัชนีเฉพาะ? เพื่อให้ MySQL สามารถเข้าใจได้ว่ามีการแทรกหรืออัพเดทค่าอยู่หรือไม่นั้นจำเป็นต้องสร้างดัชนีทั้งมูลค่าและไม่ใช่เพียงส่วนหนึ่งของมัน
ในตอนท้ายของวันหากคุณต้องการมีดัชนีที่ไม่ซ้ำกันในเขตข้อมูลเนื้อหาทั้งหมดของเขตข้อมูลจะต้องพอดีกับดัชนี สำหรับ utf8mb4 หมายถึงการลดความยาวฟิลด์ VARCHAR ของคุณเป็น 191 อักขระหรือน้อยกว่า หากคุณไม่ต้องการ utf8mb4 สำหรับตารางหรือเขตข้อมูลนั้นคุณสามารถวางกลับไปที่ utf8 และสามารถเก็บฟิลด์ความยาว 255 ฟิลด์ของคุณได้