在MySQL中将BLOB字段的字符集转换为UTF-8

时间:2016-09-16 12:14:27

标签: mysql utf-8 character-encoding blob

我最近将一个MySQL数据库从latin1转换为utf-8。所有人都与blob专栏分道扬..在一个示例中,该字段包含显示为“钻石中的问号”的错误字符。

如果我从blob中获取这些数据,通过PHP的utf8_encode()运行它就可以了。此外,如果我然后将数据从utf8_encode()保存到blob字段中,我不再需要uf8_encode()数据来显示它。

如何在不需要PHP干预的情况下转换blob数据?

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

我尝试将BLOB复制到TEXT字段,但错误仍然存​​在。

为了提供帮助,这里是来自BLOB的示例数据:

HEX:

  

613A313A7B733A373A22636F6E74656E74223B733A3333333A223C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C7370616E207374796C653D22636F6C6F723A20726762283235352C203235352C20323535293B223E3C7370616E207374796C653D22666F6E742D73697A653A20323470783B223E4672696C616E736F707064726167202D2042696C646561726B69763C2F7370616E3E3C2F7370616E3E3C2F703E0A3C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C62723E0A093C7370616E207374796C653D22666F6E742D73697A653A20323070783B223E3C7370616E207374796C653D22636F6C6F723A20726762283231312C203231312C20323131293B223E496E666F726D61736A6F6E202D20446F6B756D656E7461736A6F6E202D20507265737365202D20466F727374F87272656C7365723C2F7370616E3E3C2F7370616E3E3C2F703E0A223B7D

预期价值:

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

     

Informasjon - Dokumentasjon - Presse - Forst rrelser

使用一些PHP函数,我被告知数据是UTF8,我正在显示的页面也是UTF8。所以有点混乱为什么我得到特殊字符的错误。此外,如果我将页面编码从UTF-8更改为ISO-8859-15,则字符显示正常。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您无法在不了解blob中的编码的情况下将BLOB转换为TEXT。如果&#39;文本&#39;在BLOB中以各种方式编码,不可能在不丢失某些文本的情况下转换为TEXT。

查看blob的HEX()。例如,如果您有é,并且HEX标记为E9,则文本可能编码为latin1。相反,如果你得到C3A9,那么你可能有utf8(或utf8mb4)。如果不首先进行此分析,则可能会破坏(通过截断或变成问号)&#34;文本&#34;在你的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进行进一步讨论(并包括您认为文本应该的内容。)