2016-09-16 246 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'就是你所需要的。 –