2016-09-16 253 views
0

我最近將一個MySQL數據庫從latin1轉換爲utf-8。除了blob專欄之外,所有這些都已經很好了。在一個例子中,該字段包含顯示爲「鑽石中的問號」的錯誤字符。將BLOB字段的字符集轉換爲MySQL中的UTF-8

如果我從blob中獲取這些數據,通過PHP的utf8_encode()運行它會顯示正常。此外,如果我然後將utf8_encode()中的數據保存到blob字段中,則不再需要uf8_encode()數據來顯示它。

如何在不需要PHP干預的情況下轉換blob數據?

更新1(2016年9月19日):

我試圖複製BLOB到一個文本字段,但錯誤依然存在。

協助,這裏是從BLOB示例數據:

HEX:

613A313A7B733A373A22636F6E74656E74223B733A3333333A223C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C7370616E207374796C653D22636F6C6F723A20726762283235352C203235352C20323535293B223E3C7370616E207374796C653D22666F6E742D73697A653A20323470783B223E4672696C616E736F707064726167202D2042696C646561726B69763C2F7370616E3E3C2F7370616E3E3C2F703E0A3C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C62723E0A093C7370616E207374796C653D22666F6E742D73697A653A20323070783B223E3C7370616E207374796C653D22636F6 C6F723A20726762283231312C203231312C20323131293B223E496E666F726D61736A6F6E202D20446F6B756D656E7461736A6F6E202D20507265737365202D20466F727374F87272656C7365723C2F7370616E3E3C2F7370616E3E3C2F703E0A223B7D

期望值:

a:1:{s:7:"content";s:333:"<p style="text-align: center;"> 
    <span style="color: rgb(255, 255, 255);"><span style="font-size: 24px;">Frilansoppdrag - Bildearkiv</span></span></p> 
<p style="text-align: center;"> 
    <br> 
    <span style="font-size: 20px;"><span style="color: rgb(211, 211, 211);">Informasjon - Dokumentasjon - Presse - Forstørrelser</span></span></p> 
";} 

在這個例子中,我最終顯示以下文字:

Frilansoppdrag - Bildearkiv

Informasejon - Dokumentasjon - Presse - Forst rrelser

使用一些PHP函數,我被告知數據是UTF8,我顯示的頁面也是UTF8。所以,爲什麼我得到特殊字符的錯誤有點困惑。此外,如果我將頁面編碼從UTF-8更改爲ISO-8859-15,字符顯示正常。

感謝您的幫助!

+0

一個題外話側的問題:是什麼原因將文本保存在blob字段中,而不是保存到文本中(請參閱http://stackoverflow.com/questions/7071662/mysql-text-vs-blob-vs-clob)? – reporter

+1

BLOB的要點是它沒有與之相關的字符集..我同意@reporter - 如果您需要** charset,使用BLOB有什麼意義?將blob轉換爲文本,並解決問題。這就是你如何正確地做到這一點。 – Mjh

+0

@Mjh我剛剛做了一個海峽數據類型切換到文本和一半的數據現在被截斷。所以顯然更多的是將它從blob切換到文本。 – David

回答

0

如果不瞭解blob中的編碼,則無法將BLOB轉換爲TEXT。如果BLOB中的「文本」以各種方式進行編碼,則不可能在不丟失某些文本的情況下將其轉換爲TEXT。

看看blob的HEX()。如果你有,例如,é,並且十六進制出現爲E9,那麼文本是可能是編碼爲latin1。相反,如果你得到了C3A9,那麼你可能有utf8(或utf8mb4)。如果不首先進行分析,則可能會破壞(通過截斷或轉爲問號)BLOB中的「文本」。那會丟失的數據!

聖壇的樣子:

ALTER TABLE t MODIFY c TEXT CHARACTER SET latin1 NOT NULL; -- if E9 
ALTER TABLE t MODIFY c TEXT CHARACTER SET utf8mb4 NOT NULL; -- if C3A9 

注意:

  • 確保有一個備份;如果出現問題;數據可能會丟失。
  • tc更改爲您的表和列名稱。
  • 添加NULL或NOT NULL以匹配當前聲明。
  • 在宣言中進行其他任何事情。 (和包括你認爲文應該是)
  • 如果我E9/C3A9例子不夠清晰,讓我們看到一些HEX作進一步討論
+0

'F9'爲'ø'的latin1(或latin5或dec8)十六進制。我認爲你希望最後一個詞是'Forstørrelser'?所以,可能我的第一個'ALTER'就是你所需要的。 –