Mysql

MySQL表包含latin1但被定義為UTF8,字元編碼地獄

  • October 23, 2011

我“繼承”了一個 osCommerce 2.2、PHP4 和 MySQL4 設置,這很麻煩。問題是字元編碼。雖然表被定義為包含UTF8它們實際上包含latin1. 為了在其中混合一些全新的東西,似乎舊編碼器通過設置SET CHARACTER SET 'utf8'何時建立與數據庫的連接來手動更改它。

現在看起來像這樣:

  • MySQL: UTF8但實際上包含latin1.
  • PHP: MySQL-Connection 被手動設置為UTF8.
  • **HTML:**以ISO-8859-1aka的形式傳遞latin1

這種設置一直有效,直到一周前提供商改變了一些東西(他們實際上拒絕接觸數據庫或任何其他東西,但他們有伺服器問題)。

有問題的部分是德語特殊字元öäüß可以正確顯示,但是當您要將它們插入數據庫時,整個 osCOMmerce 會話會中斷,並且只有在插入該字元之前的文本。

  • 要插入的文本:Das _ä_ ist ein Umlaut
  • 被保存的文本:Das _

在我通過將字元集設置為建立連接時更改手動入侵的那一刻latin1,每次插入都很好,但數據庫只提供?而不是特殊字元。

我不知道如何解決這個問題,如果我將數據庫列更改為latin1失去所有特殊字元,如果我更改連接上的編碼,則顯示或插入失敗。我完全沒有想法。

當您更改另一個字元集中的數據時,您必須先將其更改為 blob,然後再更改為目標字元集 (latin1)。如果您不這樣做,mysql 會為您進行轉換,而您不會這樣做,因為您已經獲得了 latin1 中的數據?

AFAIK 當您在連接(即 php)中使用 set chatacter set 時,mysql 會自動將表中的所有數據轉換為連接的字元集。

不優雅但通常有效的解決方案:

  1. 將整個數據庫轉儲到 SQL 文件 - 檢查文本文件中是否有正確的編碼,
  2. 修復表查詢,創建 UTF-8 表
  3. 檢查數據庫的設置 - 使用 UTF-8
  4. 再次導入整個數據庫

引用自:https://serverfault.com/questions/323966