Score:3

#1267 - การผสมที่ผิดกฎหมาย (utf8mb4_0900_ai_ci,COERCIBLE) และ (latin1_swedish_ci,IMPLICIT) สำหรับการดำเนินการ 'UNION'

ธง gb

ฉันได้อัปเกรด MySQL จากเวอร์ชัน 5.7 เป็น 8 แล้ว ฉันได้ส่งออกฐานข้อมูลจาก MySQL 5.7 เก่าแล้ว และตอนนี้ฉันกำลังพยายามนำเข้าฐานข้อมูลไปยัง MySQL 8แต่ฉันได้รับข้อผิดพลาดสำหรับหนึ่งในมุมมองฐานข้อมูลที่มี union clause..

ข้อผิดพลาดคือ -

#1267 - การผสมที่ผิดกฎหมาย (utf8mb4_0900_ai_ci,COERCIBLE) และ (latin1_swedish_ci,IMPLICIT) สำหรับการดำเนินการ 'UNION'

มุมมองคือ -

สร้างการดู VIEW_ALL_ORDER_ITEMS_REF เป็น
  เลือก * จาก VIEW_ORDER_ITEM_EQ_REF
  สหภาพแรงงาน 
  เลือก * จาก VIEW_ORDER_ITEM_SO_REF
  สหภาพแรงงาน 
  เลือก * จาก VIEW_ORDER_ITEM_OA_REF
  สหภาพแรงงาน 
  เลือก * จาก VIEW_ORDER_ITEM_WO_REF
  สหภาพแรงงาน 
  เลือก * จาก VIEW_ORDER_ITEM_DO_REF

ฉันพบข้อผิดพลาดนี้เมื่อฉันพยายามใช้การรวมระหว่างสองมุมมอง

มุมมองนี้ใช้งานได้ดี

วางมุมมองถ้ามี VIEW_ALL_ORDER_ITEMS_REF;
สร้างการดู VIEW_ALL_ORDER_ITEMS_REF เป็น
  เลือก * จาก VIEW_ORDER_ITEM_EQ_REF
  สหภาพแรงงาน 
  เลือก * จาก VIEW_ORDER_ITEM_SO_REF

ใครสามารถช่วย?

in flag
คุณกำลังดำเนินการนำเข้าข้อมูลอย่างไร กู้คืนจากการถ่ายโอนข้อมูล SQL หรือไม่
rahul shalgar avatar
gb flag
ใช่............
Score:1
ธง in

ขณะที่คุณกำลังกู้คืนฐานข้อมูลจากการถ่ายโอนข้อมูล MySQL คุณสามารถแก้ปัญหาของคุณในขณะเดียวกันก็พิสูจน์ฐานข้อมูลของคุณในอนาคตด้วยการเปลี่ยนชุดอักขระและการเรียงสำหรับตาราง ฟังก์ชัน และขั้นตอนของคุณ มีการเปลี่ยนแปลงหลายอย่างระหว่าง MySQL 5.7 และ 8.x ดังนั้นนี่เป็นเวลาที่ดีที่สุดที่จะทำ

นี่คือสิ่งที่คุณสามารถทำได้กับแต่ละรายการ สร้าง คำแถลง:

  1. แทนที่ CHARSET เริ่มต้น ถึง utf8mb4

  2. แทนที่ รวบรวม ถึง utf8mb4_unicode_ci

  3. (สำหรับตาราง) ตรวจสอบให้แน่ใจว่า เครื่องยนต์ ถูกตั้งค่าเป็น อินโนดีบี

    บันทึก: คุณไม่ต้องการใช้ 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 ดูเหมือนจะไม่สนใจ

อย่าปล่อยให้ข้อผิดพลาดนี้ทำลายวันหยุดปีใหม่ของคุณเหมือนปีที่แล้ว

rahul shalgar avatar
gb flag
มันใช้งานได้ .. ขอบคุณมาก @matigo .. มีตัวเลือกใด ๆ ในการตั้งค่าชุดอักขระและเรียงหน้าทั่วโลกหรือไม่?
in flag
คุณสามารถตั้งค่าการเรียงเริ่มต้นใน `my.cnf` ได้ แต่อาจส่งผลให้เกิดปัญหาหากคุณทำการจำลองแบบข้ามเซิร์ฟเวอร์หลายเครื่อง และเซิร์ฟเวอร์หนึ่งไม่มีค่าการเรียงในไฟล์การกำหนดค่า มันเป็นเคสที่ขอบ แต่มันจะเจ็บถ้าโดน การประกาศอย่างเฉพาะเจาะจงจะช่วยประหยัดความเจ็บปวดได้มากมายในอนาคต
rahul shalgar avatar
gb flag
ครับ ขอบคุณครับพี่...
rahul shalgar avatar
gb flag
ฉันไม่มีขั้นตอนการจัดเก็บและทริกเกอร์ในฐานข้อมูลของฉัน .. มันมีเพียงตาราง .. แทนที่จะกู้คืนฐานข้อมูลจากการถ่ายโอนข้อมูล SQL ฉันสามารถเปลี่ยนตารางทั้งหมดของฉันในฐานข้อมูลที่มีอยู่เพื่อเปลี่ยนชุดอักขระและการเรียงได้หรือไม่
in flag
คุณสามารถเปลี่ยนแปลงได้ ใช่ โปรดทราบว่าอาจมีข้อความที่อ่านไม่ออกในภายหลัง เนื่องจากคำสั่ง 'ALTER TABLE' และ 'ALTER COLUMN' นั้นไม่มีข้อบกพร่องเมื่อย้ายข้อมูลระหว่างการเรียง หากข้อความทั้งหมดของคุณเป็นแบบมาตรฐาน A-Z และ 0-9 คุณก็ไม่มีปัญหา หากคุณมีอักขระที่ไม่ใช่ภาษาละติน คุณจะต้องการทดสอบ ทดสอบ และทดสอบเพิ่มเติม ฉันทำงานกับข้อมูลเอเชีย ฮิบรู และอารบิกจำนวนมาก และประสบปัญหามากมายในช่วงหลายปีที่ผ่านมาเมื่อพยายาม "ประหยัดเวลา" การนำเข้าซ้ำหลังจากแก้ไขไฟล์ `.sql` นั้นเร็วที่สุดเสมอสำหรับฐานข้อมูลที่มีขนาดใหญ่กว่า 1GB

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา