charset和数据问题

时间:2011-04-24 22:38:27

标签: php mysql

我试着用可怜的英语解释整个问题:

我使用PHPlatin1)的默认连接将数据从我的应用程序(在utf8上编码)保存到我的数据库表latin1作为字符集。

这不是一个大问题:例如,字符串Magnüs存储为Magnüs,当我恢复数据时,我正确地看到字符串Magnüs(因为默认连接,latin1)。

现在,我使用正确的字符集更改连接mysql_query("SET NAMES 'utf8'", $mydb),并且我还更改了表格字段的字符集,因此现在值正确存储为数据库Magnüs ;然后,当我检索数据并且在我的Web应用程序上打印时,我仍然看到Magnüs

当然,不幸的是,现在一些旧的值打印得很糟糕(Magnüs打印为Magnüs)。

我想做的是“使用真实编码转换”这些旧值。

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8;只会转换字段类型,而不会转换数据。

因此,解决方案(在互联网上发现)应该是这样的:

ALTER TABLE table CHANGE field field BLOB;
ALTER TABLE table CHANGE field field VARCHAR(255) CHARACTER SET utf8;

但是这些旧字符串在数据库中不会改变,因此在打印它们时Web应用程序中都不会改变。

为什么呢?我该怎么办?

1 个答案:

答案 0 :(得分:1)

确保您的表单正在发送UTF-8编码文本,并且表格中的文本也是UTF-8编码。

根据MySQL reference,您提到的最后两个ALTER不会更改列内容编码,更像是对内容的“重新解释”。

  

警告   CONVERT TO操作在字符集之间转换列值。如果您在一个字符集中有一个列(如latin1),那么这不是您想要的,但存储的值实际上使用了一些其他不兼容的字符集(如utf8)。在这种情况下,您必须为每个此类列执行以下操作:

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
  

这样做的原因是当您转换为BLOB列或从BLOB列转换时没有转换。