簡體   English   中英

MySQL數據庫遷移PHP的UTF-8問題

[英]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_encodeutf8_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設置。

我認為您應該檢查您的MariaDB配置。

首先檢查您的php代碼,以了解是否沒有誤導性的拼寫錯誤(但我認為沒有)

其次,檢查您的MariaDB數據庫/表結構[ 從此處提取 ]:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;

第三,檢查您的MariaDB文件配置(my.cnf)[ 從此處提取 ]:

    [client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4

然后重新啟動服務器:

mysql.server restart

希望它能幫助您解決問題。

再見

您是否希望現有數據發生變化? 不起作用。 您需要再次添加數據以查看更改。 從新數據庫中刪除所有數據,然后再次添加。

要檢查雙重編碼,請使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM