當前位置: 首頁> 最新文章列表> 想用UTF-8?教你如何在PHP 中正確用mysqli::set_charset 設置編碼

想用UTF-8?教你如何在PHP 中正確用mysqli::set_charset 設置編碼

gitbox 2025-09-18

什麼是UTF-8 編碼?

UTF-8(Unicode Transformation Format-8)是一種可變長度的字符編碼方式,能夠表示Unicode 字符集中的所有字符,並且對英文字符採用1 字節存儲,而對於其他字符則使用2 到4 字節存儲。它的優勢在於全球各國語言和符號都能統一表示,且兼容ASCII 編碼,廣泛應用於Web 開發和數據庫存儲中。

在PHP 中,UTF-8 編碼通常用於處理多語言網站的數據交換和存儲,尤其是在數據庫和瀏覽器之間傳輸數據時。如果編碼設置不正確,很容易導致亂碼問題。

為什麼要使用mysqli::set_charset

在PHP 中,如果你使用的是MySQL 數據庫並且通過mysqli擴展來進行數據庫連接和操作,確保數據庫連接使用UTF-8 編碼非常重要。否則,即使你的數據庫表和字段設置了UTF-8 編碼,數據傳輸過程中仍然可能因為編碼不匹配而出現亂碼問題。

mysqli::set_charset方法允許你為當前的數據庫連接設置字符集。通過設置字符集為UTF-8,確保了在數據查詢和插入過程中,PHP 與MySQL 數據庫之間能夠正確地進行編碼和解碼。

如何正確使用mysqli::set_charset設置UTF-8 編碼?

  1. 創建數據庫連接:

    使用mysqli_connectnew mysqli()方法連接數據庫。

  2. 設置字符集:

    在成功連接到數據庫後,使用mysqli::set_charset方法來設置字符集為UTF-8。

代碼示例

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 1. 創建數據庫連接</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'localhost'</span></span><span>;
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'root'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-variable">$dbname</span></span><span> = </span><span><span class="hljs-string">'your_database'</span></span><span>;

</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);

</span><span><span class="hljs-comment">// 檢查連接是否成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"連接失敗: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// 2. 設置字符集為 UTF-8</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">set_charset</span></span><span>(</span><span><span class="hljs-string">"utf8"</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"錯誤: 無法設置字符集 UTF-8: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;error;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"當前字符集: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">character_set_name</span></span><span>();
}

</span><span><span class="hljs-comment">// 3. 執行查詢等操作</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM your_table"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>-&gt;num_rows &gt; </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">while</span></span><span>(</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>()) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"數據: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'column_name'</span></span><span>] . </span><span><span class="hljs-string">"&lt;br&gt;"</span></span><span>;
    }
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"没有數據"</span></span><span>;
}

</span><span><span class="hljs-comment">// 4. 關閉連接</span></span><span>
</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

代碼解析:

  1. 數據庫連接:
    使用new mysqli()創建了一個數據庫連接,並檢查連接是否成功。如果連接失敗,則通過die()終止程序,並顯示錯誤信息。

  2. 設置字符集:
    使用$conn->set_charset("utf8")設置連接字符集為UTF-8。此時,PHP 和MySQL 數據庫之間的所有數據傳輸都會使用UTF-8 編碼。如果設置失敗,可以通過$conn->error輸出錯誤信息。

  3. 執行查詢:
    查詢your_table表中的數據,確保返回的數據能正確顯示UTF-8 編碼的字符。

  4. 關閉連接:
    最後,使用$conn->close()關閉數據庫連接。

注意事項

  • 數據庫表的字符集:
    除了在PHP 中設置字符集外,還需要確保數據庫表和字段的字符集也是UTF-8。可以通過SHOW CREATE TABLE查看表的字符集,或者通過以下SQL 語句修改表的字符集:

     <span><span><span class="hljs-keyword">ALTER</span></span><span> </span><span><span class="hljs-keyword">TABLE</span></span><span> your_table </span><span><span class="hljs-keyword">CONVERT</span></span><span> </span><span><span class="hljs-keyword">TO</span></span><span> </span><span><span class="hljs-type">CHARACTER</span></span><span> </span><span><span class="hljs-keyword">SET</span></span><span> utf8 </span><span><span class="hljs-keyword">COLLATE</span></span><span> utf8_general_ci;
    </span></span>
  • 瀏覽器編碼:
    確保在HTML 頁面的<head>標籤中設置了正確的字符集,避免瀏覽器顯示亂碼。通常可以使用以下標籤設置:

     <span><span><span class="hljs-tag">&lt;<span class="hljs-name">meta</span></span></span><span> </span><span><span class="hljs-attr">charset</span></span><span>=</span><span><span class="hljs-string">"UTF-8"</span></span><span>&gt;
    </span></span>
  • MySQL 服務器默認字符集:
    如果你希望MySQL 服務器默認使用UTF-8 編碼,可以在MySQL 配置文件my.cnfmy.ini中設置:

     <span><span><span class="hljs-section">[mysqld]</span></span><span>
    </span><span><span class="hljs-attr">character-set-server</span></span><span> = utf8
    </span><span><span class="hljs-attr">collation-server</span></span><span> = utf8_general_ci
    </span></span>

總結

使用mysqli::set_charset設置UTF-8 編碼是確保PHP 與MySQL 數據庫之間正確處理多語言數據的一個重要步驟。通過正確配置字符集,不僅可以避免亂碼問題,還能保證數據在傳輸過程中不會丟失或錯誤編碼。確保數據庫表和字段的字符集也為UTF-8,才能在整個應用中保持一致的編碼設置,進而提高項目的兼容性和可擴展性。