Mysql:latin1-> UTF8。将字符转换为其多字节等效项

时间:2009-11-11 11:34:28

标签: php mysql encoding

latin1 中有一个表格, cp1252 中有一个网站 我希望在 utf8 中有表格,在 utf-8 中有网站

我做完了:

1)在网页上:Content-Type: text/html;charset=utf-8

2)Mysql:ALTER TABLE XXX CONVERT TO CHARACTER SET utf8

_

此SQL无法正常工作 - 它不会转换ä& ü数据库中的字符与其多字节等值

请帮助。 罐

3 个答案:

答案 0 :(得分:2)

正如this blog post所说,使用MySQL的ALTER TABLE CONVERT语法是A Bad Idea [TM]。导出数据,转换表格然后重新导入数据,如博客文章中所述。

另一个想法:您是否通过/etc/my.cnf或mysqli::set-charset设置了默认客户端连接字符集。

答案 1 :(得分:2)

我一直是个傻瓜。 SET NAMES 缺失。

我现在所知道的:

1)每次更改列的字符集时,实际数据总是被重新编码!将字段更改为二进制以查看。

2)列的字符集优先于!,表和db字符集紧随优先级。它们主要用于设置默认值。 (不是100%肯定最后一句)

3)SET NAMES 非常重要。当你正确设置NAMES时,德语字符可以进入latin1并被正确放置在utf8表中(由Mysql以静默方式重新编码)。无论表格编码是什么,服务器都可以按照您希望的编码将数据发送到网页。它可以重新编码为输出

4)如果编码A中有一列和编码B中的列,并且你比较它们(或使用LIKE),Mysql将默默地转换它们,使它看起来像是在一个编码中

5)Mysql很聪明。除非类型为 binary ,否则它永远不会像文本那样使用字节操作。它总是作为角色运作!如果他知道数据编码,他希望latin1中的ё在utf8中等于ё

答案 2 :(得分:0)

由于您声称现在已经退回,因此表明在数据库中修改了字符。

你如何访问mysql中的数据?如果您正在使用PHP等编程接口,那么您可能需要告诉该接口期望的字符编码。

例如,在PHP中,您需要调用类似mysql_set_charset("utf8");的内容,但也可以使用SET NAMES utf8

的SQL查询来完成

然后,您还需要确保显示文本的内容知道它是utf8并且使用适当的编码进行渲染。例如,在网页上,您需要将内容类型设置为utf-8。像Content-Type: text/html;charset=utf-8

这样的东西