ขณะที่คุณกำลังกู้คืนฐานข้อมูลจากการถ่ายโอนข้อมูล MySQL คุณสามารถแก้ปัญหาของคุณในขณะเดียวกันก็พิสูจน์ฐานข้อมูลของคุณในอนาคตด้วยการเปลี่ยนชุดอักขระและการเรียงสำหรับตาราง ฟังก์ชัน และขั้นตอนของคุณ มีการเปลี่ยนแปลงหลายอย่างระหว่าง MySQL 5.7 และ 8.x ดังนั้นนี่เป็นเวลาที่ดีที่สุดที่จะทำ
นี่คือสิ่งที่คุณสามารถทำได้กับแต่ละรายการ สร้าง
คำแถลง:
แทนที่ CHARSET เริ่มต้น
ถึง utf8mb4
แทนที่ รวบรวม
ถึง utf8mb4_unicode_ci
(สำหรับตาราง) ตรวจสอบให้แน่ใจว่า เครื่องยนต์
ถูกตั้งค่าเป็น อินโนดีบี
บันทึก: คุณไม่ต้องการใช้ MyISAM อีกต่อไป และไม่ต้องการผสม เครื่องยนต์
พิมพ์ด้วยคำค้นหา เนื่องจากเป็นประสิทธิภาพที่ค่อนข้างสำคัญ
ทำทั้งหมดนี้ด้วยโปรแกรมแก้ไขข้อความที่คุณต้องการ จากนั้นเรียกใช้กระบวนการนำเข้าไปยังฐานข้อมูล MySQL ใหม่ อย่าลืมตั้งค่าฐานข้อมูล CHARSET เริ่มต้น
และ รวบรวม
ค่าเดียวกันกับที่คุณมีสำหรับตาราง ฟังก์ชัน และโพรซีเดอร์
เหตุผลสำหรับคำแนะนำ:
MySQL 8.0 เป็นการออกจากบรรทัด 5.x อย่างมีนัยสำคัญ โดยมีรายการจำนวนมากที่เลิกใช้งานก่อนที่ 5.2 จะถูกลบออกทั้งหมด ซึ่งรวมถึงคอลัมน์บางประเภท ตลอดจนการเรียงหน้า กระบวนการนำเข้าจะพยายามปรับองค์ประกอบที่เลิกใช้แล้วให้เทียบเท่ากับสมัยใหม่โดยอัตโนมัติ แต่มักจะทำให้ชุดอักขระและการเรียงชุดยุ่งเหยิง
เดอะ utf8mb4_unicode_ci
ได้รับการพิสูจน์แล้วว่าเป็นการเปรียบเทียบที่น่าเชื่อถือที่สุดเมื่อทำงานกับอักขระหลายไบต์ เช่น อิโมจิและอักขระที่ใช้ในภาษาที่ไม่ใช่ภาษาอังกฤษแม้ว่าจะใช้พื้นที่ดิสก์เพิ่มขึ้นเล็กน้อย แต่วิธีนี้จะทำให้มั่นใจได้ว่าแอปพลิเคชันของคุณสามารถจัดการกับอักขระใดๆ ที่ส่งเข้ามาได้ เดอะ _ci
บิตในตอนท้ายช่วยให้มั่นใจว่าค่าต่างๆ จะถือว่าไม่คำนึงถึงขนาดตัวพิมพ์เมื่อเข้าร่วมและทำการค้นหา
แทนที่ทั้งหมดของ CHARSET
และ รวบรวม
ค่าจะทำให้คุณไม่ได้รับ การผสมผสานที่ผิดกฎหมายของการเปรียบเทียบ
ข้อผิดพลาดอีกครั้ง ... เว้นแต่ ...
สิ่งที่ต้องพิจารณาเกี่ยวกับ Stored Procedures และ Triggers
MySQL 8.0 ดูเหมือนจะคาดหวังความเฉพาะเจาะจงมากกว่านี้เล็กน้อยเมื่อสร้างตารางชั่วคราวในกระบวนงานที่เก็บไว้ หากคุณใช้ตารางชั่วคราว ต้องแน่ใจว่าได้กำหนดไว้ล่วงหน้าในโค้ดเช่นเดียวกับที่คุณทำกับตารางปกติ ไวยากรณ์ค่อนข้างเหมือนกัน ยกเว้นว่าคุณกำลังเพิ่มคำเพิ่มเติม:
วางตารางชั่วคราวหากมี `ผลรวมรายปี';
สร้างตารางชั่วคราวหากไม่มี `ผลรวมรายปี ` (
...
) ENGINE=ค่าเริ่มต้นของ InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
สิ่งนี้จะช่วยให้แน่ใจว่าคุณจะไม่พบเจอกับ การผสมผสานที่ผิดกฎหมายของการเปรียบเทียบ
ข้อผิดพลาดเมื่อทำงานกับกระบวนงานที่เก็บไว้
หากตารางของคุณมี ก่อนแทรก
หรือ ก่อนการปรับปรุง
ทริกเกอร์และตารางเหล่านั้นจะถูกเติมผ่านกระบวนงานที่เก็บไว้ คุณจะต้องทำการทดสอบจำนวนมากก่อนที่จะวางฐานข้อมูลลงในการตั้งค่าการผลิต Oracle นำเสนอข้อบกพร่องที่ค่อนข้างร้ายแรงใน 8.0.25 ซึ่งอาจส่งผลให้เอ็นจิ้น MySQL Server หยุดทำงานในบางกรณีเมื่อ ก่อน
ทริกเกอร์กำลังประมวลผลแถวซึ่งเป็นส่วนหนึ่งของการตรวจสอบข้อมูล แต่เฉพาะเมื่อข้อมูลนั้นจัดเตรียมโดยกระบวนงานที่เก็บไว้เท่านั้น ปัญหานี้เกิดขึ้นมานานกว่าหนึ่งปีแล้ว และ Oracle ดูเหมือนจะไม่สนใจ
อย่าปล่อยให้ข้อผิดพลาดนี้ทำลายวันหยุดปีใหม่ของคุณเหมือนปีที่แล้ว