【问题标题】:Converting latin mysql data to utf8将拉丁 mysql 数据转换为 utf8
【发布时间】:2011-02-28 12:20:09
【问题描述】:

我现在想使用 utf 8,但我所有的数据都是 latin1,什么是转换数据的有效方法。我也知道如何将数据库的结构(字符集)更改为 utf8 ,我想做的是更改现有数据的字符集。

更新

这是我的旧设置,

  1. HTML 输出:utf8
  2. HTML 输入:utf8
  3. php - mysql 连接:latin1
  4. mysql(字段和表):latin1

这是我的新设置,我希望这是创建多语言网站的最佳方式

  1. HTML 输出:utf8
  2. HTML 输入:utf8
  3. php - mysql 连接:utf8
  4. sql(字段和表):utf8

【问题讨论】:

    标签: mysql unicode utf-8


    【解决方案1】:

    如果将 utf8_encode() 应用于已经是 UTF8 的字符串,它将返回一个乱码的 UTF8 输出。

    我创建了一个函数来解决所有这些问题。它叫做 forceUTF8()。

    你不需要知道你的字符串的编码是什么。它可以是 Latin1 (iso 8859-1) 或 UTF8,或者字符串可以是两者的混合。 forceUTF8() 会将所有内容都转换为 UTF8。

    我这样做是因为一项服务向我提供了一个混乱的数据源,将 UTF8 和 Latin1 混合在同一个字符串中。

    用法:

    $utf8_string = forceUTF8($utf8_or_latin1_or_mixed_string);
    
    $latin1_string = forceLatin1($utf8_or_latin1_or_mixed_string);
    

    我添加了另一个函数 fixUFT8(),它将修复每个看起来乱码的 UTF8 字符串。

    用法:

    $utf8_string = fixUTF8($garbled_utf8_string);
    

    例子:

    echo fixUTF8("Fédération Camerounaise de Football");
    
    echo fixUTF8("Fédération Camerounaise de Football");
    
    echo fixUTF8("FÃÂédÃÂération Camerounaise de Football");
    
    echo fixUTF8("Fédération Camerounaise de Football");
    

    将输出:

    Fédération Camerounaise de Football
    
    Fédération Camerounaise de Football
    
    Fédération Camerounaise de Football
    
    Fédération Camerounaise de Football
    

    更新:我将 theese 转换为静态类,它们现在住在 Github:

    https://github.com/neitanod/forceutf8

    【讨论】:

    • 感谢 Sebastián,这将非常有帮助。我有一个混在一起的源数据库,我怀疑他们在这里和那里改变了排序规则:)
    【解决方案2】:

    您需要更改排序规则(到 utf-8)。这是轻松执行此操作的脚本。 http://blog.vision4web.net/2008/11/change-collation-on-all-tables-and-columns-in-mysql/ 我有这个脚本的经验,它工作得很好

    【讨论】:

    • 您链接到的脚本说它不会转换数据,但它看起来仍然很有趣/相关。
    【解决方案3】:

    您实际上使用的是 latin1 部分,还是您的数据实际上是 ASCII 码?

    似乎有这样的命令:

    ...但是要小心,我也发现了这个:

    如果出现这种情况的命令失败,另一种方法可能是将表转储到文件中,对其进行转换,然后重新导入。 (或者,如果你能说服它转储到 UTF-8,那就更好了......)

    似乎有很多关于此的信息:http://www.google.com/search?q=mysql+convert+table+to+utf8

    【讨论】:

      【解决方案4】:

      创建名为 dbname_new 的新数据库的最佳解决方案是从旧数据库中执行 SQL 转储。

      然后获取该转储并将字符集信息替换为新的 utf8 数据,并确保将 sql 文件本身重新保存为 utf8。

      然后将其加载回新数据库,检查一切正常,然后重命名。

      这在网络上可能是一个漫长的过程,因此我建议您通过 ssh shell 会话来完成,并充分利用 bash 管道等。

      【讨论】:

        【解决方案5】:

        关于该主题的优秀资源:

        Turning MySQL data in latin1 to utf8 utf-8

        【讨论】:

        • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
        【解决方案6】:

        如果您可以/想要使用存储为 latin1 的数据,但只想将其显示为 UTF-8,那么将 UTF-8 指定为连接字符集也应该可以。一种测试方法是发出查询

        SET NAMES 'utf8'
        

        一旦建立连接,在读取/写入任何数据之前。

        更多详情请点击此处http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

        【讨论】:

        • 我不想将数据存储为 latin1 ,我想转换它
        猜你喜欢
        • 2010-11-28
        • 2010-11-29
        • 2011-02-02
        • 2023-03-19
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 2022-11-12
        • 1970-01-01
        相关资源
        最近更新 更多