我试着用可怜的英语解释整个问题:
我使用PHP
(latin1
)的默认连接将数据从我的应用程序(在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应用程序中都不会改变。
为什么呢?我该怎么办?
答案 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列转换时没有转换。