Mysql
MySQL表包含latin1但被定義為UTF8,字元編碼地獄
我“繼承”了一個 osCommerce 2.2、PHP4 和 MySQL4 設置,這很麻煩。問題是字元編碼。雖然表被定義為包含
UTF8
它們實際上包含latin1
. 為了在其中混合一些全新的東西,似乎舊編碼器通過設置SET CHARACTER SET 'utf8'
何時建立與數據庫的連接來手動更改它。現在看起來像這樣:
- MySQL:
UTF8
但實際上包含latin1
.- PHP: MySQL-Connection 被手動設置為
UTF8
.- **HTML:**以
ISO-8859-1
aka的形式傳遞latin1
這種設置一直有效,直到一周前提供商改變了一些東西(他們實際上拒絕接觸數據庫或任何其他東西,但他們有伺服器問題)。
有問題的部分是德語特殊字元
öäüß
可以正確顯示,但是當您要將它們插入數據庫時,整個 osCOMmerce 會話會中斷,並且只有在插入該字元之前的文本。
- 要插入的文本:
Das _ä_ ist ein Umlaut
- 被保存的文本:
Das _
在我通過將字元集設置為建立連接時更改手動入侵的那一刻
latin1
,每次插入都很好,但數據庫只提供?
而不是特殊字元。我不知道如何解決這個問題,如果我將數據庫列更改為
latin1
失去所有特殊字元,如果我更改連接上的編碼,則顯示或插入失敗。我完全沒有想法。
當您更改另一個字元集中的數據時,您必須先將其更改為 blob,然後再更改為目標字元集 (latin1)。如果您不這樣做,mysql 會為您進行轉換,而您不會這樣做,因為您已經獲得了 latin1 中的數據?
AFAIK 當您在連接(即 php)中使用 set chatacter set 時,mysql 會自動將表中的所有數據轉換為連接的字元集。
不優雅但通常有效的解決方案:
- 將整個數據庫轉儲到 SQL 文件 - 檢查文本文件中是否有正確的編碼,
- 修復表查詢,創建 UTF-8 表
- 檢查數據庫的設置 - 使用 UTF-8
- 再次導入整個數據庫