[英]MySQL database migration UTF-8 issues with PHP
我正在將現有數據庫遷移到另一台服務器。 為此,我已經使用phpMyAdmin SQL查詢導出和導入了數據庫。 一切正常,除了某些UTF-8字符在網站上顯示為殘破。 我使用相同的PHP代碼(在不同的服務器上,但具有相同的PHP擴展名和版本)獲取它們。
我在新網站和數據庫(舊的和新的)(使用phpMyAdmin)上看到的字符串示例: péri-prothétique
我在舊網站péri-prothétique
看到的字符串péri-prothétique
如您所見,PHP曾經以正確的方式自動對字符進行編碼,甚至認為字符在數據庫中已損壞,但現在不再這樣做(即使我顯式地對utf8_encode
或utf8_decode
結果也是如此)。 我什至嘗試在每個連接上強制$mysqli->set_charset("UTF8")
無效。
Web服務器,數據庫服務器,服務器連接,PHP和表都使用UTF-8或utf8mb4字符集和排序規則,並且設置方式與舊版本相同。
我看到的唯一區別是,新的數據庫服務器是MariaDB而不是MySQL,而其網絡服務器是nginx而不是Apache。
phpMyAdmin的新數據庫規格圖片:
舊數據庫規格圖片:
運行網站和PHP的新Web服務器規范(與舊的相同,但服務器不同):Apache 2.4 PHP 7.0
如何找回舊的正確編碼? 為什么PHP不再自動將其正確解碼?
更新:使用mb_detect_encoding
我看到新版本和舊版本的PHP都會在查詢結果中檢測到ASCII或UTF-8,這取決於是否至少有一個UTF-8符號。 問題是在新版本中,PHP即使認為將字符串編碼檢測為UTF-8,也無法正確顯示UTF-8符號。
更新2:由於這個問題,我弄清楚了為什么我的條目被弄亂了: 雙重編碼是由於數據庫排序規則是latin1_swedish_ci
而表排序規則是utf8_general_ci
。 由於舊網站會自動“翻譯”這些變形的字符,並將其正確呈現在HTML中,因此這並不能回答這個問題,我想將該行為復制到新的網站中,該網站是一個不同的網站,但是具有相同的代碼和php.ini設置。
您是否希望現有數據發生變化? 不起作用。 您需要再次添加數據以查看更改。 從新數據庫中刪除所有數據,然后再次添加。
要檢查雙重編碼,請使用SELECT HEX(col)...
é
應該返回C3A9
(正確的utf8),而顯示C383C2A9
(雙重編碼)。
請參閱: UTF-8字符有問題; 我看到的不是我存儲的
如果您實際上確定您使用的是雙重編碼,則此修復程序涉及
UPDATE tbl SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4);
參見http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
是的,“雙重編碼”是一個無聲的錯誤-兩個錯誤構成對(某種)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.