Score:1

Ubuntu 20.04.2 การอัพเกรด MySQL ทำให้ข้อมูลของเราเสียหาย ... จะแก้ไขได้อย่างไร?

ธง mx

เราอัปเกรดจาก Ubuntu Server 18.04.5 LTS เป็น Ubuntu Server 20.04.2 LTS ทุกอย่างดูเหมือนจะดีจนกระทั่งวันนี้เมื่อเราสังเกตเห็นว่าหนึ่งในแอปพลิเคชันของเราใช้งานไม่ได้อีกต่อไป MySQL ดูเหมือนจะมีอักขระ Unicode ที่สับสน (จัดเก็บเป็น UTF-8) ในฐานข้อมูลเมื่อซอฟต์แวร์ฐานข้อมูลได้รับการอัปเกรด

ตัวอย่างเช่น อักขระ UTF-8:

0xF0 0x9F 0x8C 0xB5

กลายเป็น:

0xC3 0xB0 0xC5 0xB8 0xC5 0x92 0xC2 0xB5

ดูเหมือนว่าบางอย่างระหว่างการอัปเกรดจะเข้ารหัสข้อมูลสองครั้งเป็น UTF-8 แม้ว่าข้อมูลนั้นจะเป็นข้อมูลก็ตาม แล้ว UTF-8 ที่ถูกต้อง

อักขระที่ตั้งค่าไว้บนโต๊ะก่อนการอัปเกรดคือ 'utf8' ตอนนี้ชุดอักขระของตารางคือ 'utf8mb3'

ไม่แน่ใจว่าต้องทำอย่างไรที่นี่เพื่อแก้ไขปัญหา

in flag
มีปัญหากับแอปพลิเคชัน Django หรือไม่
mx flag
ไม่ ไม่แน่ใจเหมือนกันว่าทำไมบางคนถึงลงคะแนนนี้ Downvotes มีไว้สำหรับ "ไม่แสดงการวิจัยหรือความพยายามใด ๆ ไม่ชัดเจนหรือไม่มีประโยชน์" ไม่มีข้อใดที่ใช้ได้ ฉันได้ทำการวิจัยแล้วและสิ่งที่ดีที่สุดที่ฉันพบคือ: https://stackoverflow.com/questions/11436594/how-to-fix-double-encoded-utf8-characters-in-an-utf-8-table แต่ แบบสอบถาม SQL เดียวเป็นหนทางไกลจากการแก้ปัญหาจริง การอัปเกรดเป็น Ubuntu อัปเกรด MySQL เป็น v8.0 และเปลี่ยนตารางและข้อมูลในนั้นในลักษณะที่เสียหาย
in flag
เหตุผลที่ฉันถามเกี่ยวกับการใช้ Django เป็นเพราะบางระบบ เช่น นั้น มีความคาดหวังเป็นพิเศษจากเอ็นจิ้น DB ตามการกำหนดค่าการเชื่อมต่อ คุณบอกว่าสิ่งนี้เกิดขึ้นกับระบบ *หนึ่ง* ไม่ใช่ทั้งหมด ดังนั้นข้อสันนิษฐานคือแอปพลิเคชันที่เข้มงวดจึงต้องการการอัปเดต UTF8 (ใน MySQL 5.x และต่ำกว่า) เลิกใช้ Utf8mb4 แล้ว แต่จำเป็นต้องสร้างตารางใหม่เพื่อแปลงตารางฐานข้อมูลเดิมเป็นชุดอักขระปัจจุบัน เนื่องจากคำถามมีรายละเอียดไม่เพียงพอที่จะเสนอคำแนะนำที่เฉพาะเจาะจง
mx flag
เกือบจะไม่ได้ถูกจำกัดไว้เพียงแอปพลิเคชันเดียวเท่านั้น เป็นเพียงแอปพลิเคชันเดียวที่เราสังเกตเห็นว่ามีแนวโน้มที่จะใช้ Unicode (โดยเฉพาะอีโมจิ) ข้อมูลได้รับการทำให้เป็นอนุกรมในฐานข้อมูล (ซึ่งเราทำหลายครั้ง) และตัวแยกซีเรียลไลเซอร์กำลังแยกข้อมูลออกเนื่องจาก MySQL กำลังส่งคืนอักขระ UTF-8 ที่เข้ารหัสสองครั้ง การใช้ไคลเอนต์ MySQL แสดงให้เห็นว่าข้อมูลถูกเข้ารหัสสองครั้ง (เช่น ไม่ใช่ปัญหากับแอปพลิเคชัน)
mx flag
ประเด็นคือใครก็ตามที่เรียกใช้ MySQL ใน Ubuntu Server LTS 18.04 และอัปเกรดเป็น 20.04 และมีตารางในฐานข้อมูลที่มีชุดอักขระ 'utf8' จะพบปัญหาเดียวกัน ดังนั้นจึงมีความเกี่ยวข้องและมีประโยชน์อย่างเต็มที่และต้องการการแก้ไขที่ใช้งานได้
mx flag
โอเค หลังจากต่อสู้กับสิ่งนี้มาหลายชั่วโมง ฉันก็มีวิธีแก้ไขบางส่วน: ขั้นแรกให้แปลงชุดอักขระในตารางเป็น `utf8mb4` โดยใช้ `ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4` จากนั้นสำหรับแต่ละคอลัมน์ที่ได้รับผลกระทบ ให้ใช้แบบสอบถาม SQL จากโพสต์ SO เพื่อแก้ไขข้อมูลในคอลัมน์ ทำทั้งหมดนั้นก่อนในชุดตารางฐานข้อมูลที่แยกจากกันและโคลนเพื่อหลีกเลี่ยงไม่ให้อะไรแย่ลงโดยไม่ตั้งใจ แต่อย่างที่ฉันพูดไป นี่เป็นวิธีแก้ปัญหาเบื้องต้นบางส่วนที่ *ปรากฏ* เพื่อทำให้ข้อมูลถูกต้อง แต่มันก็ยังห่างไกลจากคำตอบ ฉันจะต้องสร้างเครื่องมือเพื่อระบุว่าปัญหาแพร่กระจายมากเพียงใด
mx flag
โอเค หลังจากผ่านไปนานกว่านี้ ฉันได้ประมวลผลข้อมูลทั้งหมดของเราแล้ว วิธีการข้างต้นใช้การได้ ฉัน *ขอแนะนำอย่างยิ่งให้ส่งออกข้อมูลของคุณโดยใช้การเชื่อมต่อ `utf8` ทำการอัปเกรด MySQL แก้ไขเฉพาะฟิลด์ด้วยอักขระ Unicode จากนั้นกู้คืนข้อมูลที่เสียหายจากข้อมูลที่ส่งออก (เช่น การส่งออกของคุณถูกต้อง MySQL บางครั้งก็ผิดพลาด) เพราะ https://stackoverflow.com/questions/11436594/how-to-fix-double-encoded-utf8-characters-in-an-utf-8-table จะทำให้ข้อมูลเสียหายอย่างแน่นอนในฐานข้อมูล! การประมวลผลข้อมูลหลายล้านแถวเป็นวิธีที่ฉันรู้ว่าเป็นจริง

โพสต์คำตอบ

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