mysql - 编码未正确呈现
问题描述
我正在使用 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 编码字符。到目前为止,一切都很好。
但是当我在我的网站中显示此描述时,它显示为“é”。
编辑:请注意,该数据库为另一个应用程序提供服务,并且在其上正确显示。
我不知道是否:
- 在数据库中显示 é 是否正确
- latin1 上的 character_set_server 是否正确
- 新应用程序有问题的地方
解决方案
似乎数据库是双重编码的: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 的副本上测试这个非常重要,在安全的地方有一个转储等等。要非常小心。
这篇文章的学分是法语的,所以我翻译了它以供将来的读者阅读。
推荐阅读
- android - 从远程网站访问科尔多瓦相机
- rest - 合作伙伴中心 获取资源名称对象级别
- arrays - 计算现有表中的重复出现次数
- php - 如果列包含 Laravel 中的 JSON 编码数据,我如何在数据库中搜索值
- excel - 将数据从 Query 丢失到 Excel 工作表
- ssis - 无法从 SSIS 访问 DB2 的全局临时表
- javascript - 从另一个 XPath 结果获取 XPath 结果
- excel - 如何在 PowerBI / Excel 中创建以下(描述中的链接)数据透视表?
- node.js - Node.js Promise.all 当函数什么都不返回时
- perl - 使用 perl 验证电话号码