首页 > 解决方案 > 编码未正确呈现

问题描述

我正在使用 MariaDB,版本如下: MariaDB 版本

在此处输入图像描述

编码如下:Mysql Encoding

在此处输入图像描述

据我了解,它是全球 UTF-8。注意 character_set_server 的“latin1”。

如果我为表“Foo”创建脚本,它显示为:

CREATE TABLE `Foo` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  . . . 
  `description` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5475 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

到目前为止,一切都很好。

我正在使用 TypeORM 来检索我的信息(注意:数据库在实现 TypeORM 之前已经存在),我将其配置如下:

TypeOrmModule.forRoot({
    type: 'mysql',
    ...
    charset: 'utf8'
}),

在我的 Angular 应用程序中,我添加了 header 标签:

<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

如果我在 mysql 上的 cb_marchand 中获取此记录,它会显示如下:数据示例

在此处输入图像描述

:“Lancé en 2007,Deco-Smart aujourd'hui est le site incontournable de ventes privées déco et design。”

据我了解,“é”是 UTF-8 编码字符。到目前为止,一切都很好。

但是当我在我的网站中显示此描述时,它显示为“é”。

编辑:请注意,该数据库为另一个应用程序提供服务,并且在其上正确显示。

我不知道是否:

标签: mysqlangularmariadbtypeorm

解决方案


似乎数据库是双重编码的:UTF-8 和 latin1。

为了解决这个问题,我需要:

  • 将数据库编码为 utf8mb4
  • 将数据库转换成utf8mb4

要为一个字段执行后面的操作,我们可以使用:

update TABLE_NAME set NOM_CHAMP = convert(binary convert(FIELD_NAME using latin1) using utf8mb4);

(未在我的基地测试,我做了以下 :)

使用 mysqldump 将数据库全部转换为一个(所有表/字段/数据):

mysqldump -u root -p --opt --quote-names --skip-set-charset --default-character-set=latin1 DATABASE_NAME > DB.sql

然后 :

mysql -u root -p --default-character-set=utf8mb4 DATABASE_NAME < DB.sql

对于它可能关心的人,我相信在你的 dababase 的副本上测试这个非常重要,在安全的地方有一个转储等等。要非常小心。

这篇文章的学分是法语的,所以我翻译了它以供将来的读者阅读。


推荐阅读