【问题标题】:How to convert old database in mysql form latin1 to utf8如何将mysql格式latin1中的旧数据库转换为utf8
【发布时间】:2012-08-05 11:34:12
【问题描述】:

我有一个 latin1 格式的数据库,所有存储的 utf8 字符都显示为 ????

 +------+---------+-------+---------+--------------------+----------+--------------------      -----+---------------------+---------------------+---------+
 | id   | user_id | fname | lname   | designation        | location | email                    | created_at          | updated_at          | country |
 +------+---------+-------+---------+--------------------+----------+------------------------- +---------------------+---------------------+---------+
 | 6035 |    6035 | ????? | ??????? | ???????? ????????? |          |  ccc@rddd.net            | 2011-04-11 06:05:54 | 2011-04-10 06:13:04 | xxxxxxxxx |
 +------+---------+-------+---------+--------------------+----------+-------------------------+---------------------+---------------------+---------+

现在我用这个命令,把数据库和表的格式改成utf8

  ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8;

  ALTER DATABASE <database_name> CHARACTER SET utf8;

我读过 latin1 对每个字符使用 1 个字节,但 utf8 对每个字符使用 3 个字节。我的问题是如果我将我的表(已经包含大量数据)从 latin1 更改为 utf8,那么旧的字符数据会消耗 3 字节还是 1 字节。如果我使用更改并转换数据,我会对旧数据有问题吗?我确信新数据将采用 utf8 格式。

【问题讨论】:

    标签: mysql database utf-8 latin1


    【解决方案1】:

    首先,你应该尝试:

    SET NAMES 'utf8'
    SET CHARACTER SET utf8
    

    并选择您的第 #6085 行,以验证记录的数据是否未损坏并以 UTF8 格式编码。

    UTF8(与 UTF16 不同)为了向后兼容,对 ASCII 字符使用 1 个字节。其他字符最多使用 4 个字节 (unicode faq)。

    如果数据已经以 UTF8 格式存储,则不应转换它们。


    警告

    1. 在备份上尝试使用 ALTER TABLE。
    2. ALTER TABLE 会锁定您的数据库。

    【讨论】:

    • 数据库在 alter table 运行时是可读的,但不能更新和写入。我尝试设置名称和字符,但数据仍显示为???
    • 所以,我认为您的数据无法转换为 utf8。因为它们是由 latin1 结构上的 latin1 连接器插入的。
    • 当我使用 CONVERT TO CHARACTER SET 和 Modify 命令时,它会转换它们,我看不到任何错误,它工作正常。虽然旧数据无效的utf8数据没有恢复
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2016-07-13
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多