0

我有一个 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 格式。

4

1 回答 1

0

首先,您应该尝试:

SET NAMES 'utf8'
SET CHARACTER SET utf8

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

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

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


警告

  1. 在备份上尝试使用 ALTER TABLE。
  2. ALTER TABLE 锁定您的数据库。
于 2012-08-08T12:06:37.610 回答