跳转到内容

Zoph/升级/将您的数据库更改为 UTF-8

来自维基教科书,为开放世界提供开放书籍

从 Zoph v0.8.1 开始,Zoph 使用 UTF-8 字符编码。为了充分利用此更改,您需要将数据库也转换为 UTF-8 编码;尤其是当您在数据库中使用任何非拉丁字符时。

重要!

这可能是一个有风险的操作,请确保您备份了数据库,并且在确定所有内容都正确转换之前不要删除它。

将数据库转换为 UTF-8

[编辑 | 编辑源代码]

执行此操作最安全的方法可能是创建一个第二个 Zoph 数据库并针对它进行测试。本文档将介绍该方法。如果您希望稍后返回旧数据库名称,或者由于托管限制只能使用单个数据库,您将不得不删除“旧”数据库并重新使用同一个数据库。在这种情况下,请仔细检查您的备份!

创建备份

mysqldump -u root -p zoph | gzip > zoph.sql.gz

创建一个新的数据库,使用 UTF-8 编码

mysql -u root -p
mysql> CREATE DATABASE zophutf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> exit
重要!

您不能使用ALTER TABLE来执行此操作,因为 MySQL 将将数据库的字符编码设置为 UTF-8,但会将其保留在任何它所在的编码(通常是 Latin-1)上,用于表格

找出您当前的编码

zcat zoph.sql.gz | grep CHARSET

通常你会看到几行像这样的代码

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

在这种情况下,我们一直在使用 latin1 编码。您还会看到某些行包含诸如AUTO_INCREMENT=161的内容,这些现在对我们来说并不重要。

我们现在将在该文件中将编码更改为 UTF-8。在我进行的测试中,实际上不需要转换字符集,只需更改编码的名称就足够了。如果您在更改前后文本正确显示,但在更改后不再显示时遇到问题,您可能需要使用iconv进行转换。如果您确实需要这样做,请告诉我,或将信息添加到本文档中。

zcat zoph.sql.gz | sed "s/CHARSET=latin1/CHARSET=utf8/g" | gzip > zophutf8.sql.gz

将数据库导入到新创建的数据库中

zcat zophutf8.sql.gz | mysql -u root -p zophutf8

您需要更新 zoph.ini 并授予您用于连接到 MySQL 的用户的权限。

zoph.ini:
db_name = "zophutf8"
db_user = "zoph_rw"
db_pass = "PASSWORD"
mysql -u root -p
mysql> grant select, insert, update, delete on zophutf8.* to zoph_rw@localhost identified by 'PASSWORD';
mysql> grant all on zophutf8.* to zoph_admin identified by 'PASSWORD';

现在,执行其余的 更新 并测试!

将数据库名称改回 zoph

[编辑 | 编辑源代码]

如果您已经测试并确认新数据库对您有效,并且您想将数据库的名称改回 zoph,则需要执行以下步骤。这些步骤实际上不是必需的,但请记住,将来的 Zoph 文档将使用 zoph 而不是 zophutf8 来引用数据库。

mysqldump -u root -p zophutf8 | gzip > zophutf8.sql.gz
mysqladmin -u root -p drop zoph
mysql -u root -p
mysql> CREATE DATABASE zoph DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> exit
zcat zophutf8.sql.gz | mysql -u root -p zoph
zoph.ini:
db_name = "zophutf8"
db_user = "zoph_rw"
db_pass = "PASSWORD"
mysql -u root -p
mysql> grant select, insert, update, delete on zoph.* to zoph_rw@localhost identified by 'PASSWORD';
mysql> grant all on zoph.* to zoph_admin identified by 'PASSWORD';

回滚到旧数据库

[编辑 | 编辑源代码]

如果您在测试过程中发现数据库转换对您无效,您可以通过更改以下内容轻松回滚到旧数据库config.inc.php:

define('DB_NAME', 'zoph')

如果您遇到问题,请 报告错误在论坛上发帖

如果您不知道什么是 UTF-8,这里提供一些背景信息。如果您想了解更多信息,请点击维基百科链接;维基百科页面上的 字符编码 也是一个很好的起点。

什么是 UTF-8?

[编辑 | 编辑源代码]

UTF-8 是一种编码字符的方式。

计算机一直在使用 ASCII 编码,它是一种 7 位编码,可以容纳 128 个不同的字符;其中 33 个用于控制字符(如转义和退格),因此剩下 96 个用于 26 个小写字母、26 个大写字母、10 个数字和少数符号,如标点符号;没有空间用于“国际”字符,例如 é、ñ 或 ä。这通常被称为 US-ASCII

但是,当 8 位字符集(通常错误地称为“8 位 ASCII”)开始使用时,出现了大约 127 个字符的额外空间。这似乎很多,但不足以对不同语言中使用的所有不同字符进行编码。创建了一系列字符集来容纳所有字符。最终,这或多或少地标准化为几十个字符集,其中 Latin-1 或 ISO-8859-1,包含大多数西欧语言所需的字符,可能是最常见的字符集之一。

对于拥有超过 26 个字符(或 255 个字符)的语言,例如中文或日语,也会出现另一个问题。针对这些语言,定义了几个双字节编码字符集,例如 Big5ISO-2022-JP

在不同字符集之间进行转换通常是不可能的:除了前 127 个字符(包含“标准”拉丁字母、数字和符号)之外,字符集之间几乎没有重叠。此外,计算机需要被告知它正在读取哪个字符集,例如,Latin-1 中的代码 232 是 è,而在 Latin-2 中,它是针对中欧和东欧语言的,它是 č。没有提示,它不知道如何对其进行解码。

最终,创建了 UTF-16 来解决这个问题,它是一个双字节编码系统,具有足够的存储空间来对当前使用的所有书写系统进行编码,并且甚至可以通过使用 32 位,可以编码的字符数量实际上是无限的。但是,该系统也存在问题:与 ASCII 或 8 位 ASCII 编码的向后兼容性有限,并且任何拉丁字符的文本都需要双倍的存储空间(每个字符 16 位,而不是 8 位)。

最终,创建了 UTF-8 来解决这个问题,其中一个字符可以在 8 位、16 位或 32 位中进行编码,其中 8 位编码将对应于原始的 7 位 ASCII 集,再加上一个前导零 - 就像在 8 位 ASCII 编码字符集中一样。

Zoph 如何处理这个问题?

[编辑 | 编辑源代码]

Zoph 长期以来一直是一个多语言程序,只是 Zoph 的多语言实现包含一个设计错误:Zoph 会根据用户使用 Zoph 的语言来更改其编码方案。因此,这意味着使用土耳其语设置的用户将创建一个相册,Zoph 将使用 ISO-8859-9 将数据存储在数据库中;当另一个用户使用法语翻译(因此使用 ISO-8859-1)检索它时,Zoph 会告诉浏览器“这是 ISO-8859-1 编码的文本”,然后发送 ISO-8859-9 编码的文本。这通常不会成为问题,除非使用 US-ASCII 集之外的字符,然后您最终会得到像“Stato della Citt? del Vaticano”,“Česká republika”和“G?teborg”这样的名称。

解决方案

[编辑 | 编辑源代码]

解决此问题的方法是将所有翻译转换为 UTF-8,始终使用 UTF-8 编码与浏览器通信,并将所有数据存储在数据库中,使用 UTF-8 编码。前两个我已经处理了,但是您需要将数据库转换为 UTF-8。

这能解决所有问题吗?

[编辑 | 编辑源代码]

不能,如果您当前有上述文本,例如在您的 Zoph 安装中出现问号或不可读字符,那么您可能无法自动消除它们。不幸的是,由于无法知道这是用什么编码写入数据库的,因此并不总能恢复它们。

但是... 对数据库的任何未来添加都应该不再存在此问题。(告诉我,如果您遇到问题!)

华夏公益教科书