MySQL-utf8字符在web前端无法正确显示

MySQL-utf8字符在web前端无法正确显示,mysql,utf-8,Mysql,Utf 8,我有一个数据库,它具有通过运行以下语句获得的latin1默认字符集-info: SELECT default_character_set_name FROM information_schema.SCHEMATA 其中schema_name=“schemaname” 此数据库中每个表和列的默认字符集设置为utf8 当我查看表中的数据时,我可以看到数据存储为utf8,例如,货币符号€存储在表中为,。类似地,撇号存储为字符™等 在web前端,我有下面的元标记,因此字符正确呈现 <met

我有一个数据库,它具有通过运行以下语句获得的latin1默认字符集-info:

  SELECT default_character_set_name FROM information_schema.SCHEMATA 
其中schema_name=“schemaname”

此数据库中每个表和列的默认字符集设置为utf8

当我查看表中的数据时,我可以看到数据存储为utf8,例如,货币符号
存储在表中为
。类似地,撇号存储为
字符™

在web前端,我有下面的元标记,因此字符正确呈现

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
我必须在我想要转换的每个专栏上运行以下内容,这似乎解决了一些问题

 UPDATE tbl_profiles SET profile =
 convert(cast(convert(profile using latin1) as binary) using UTF8MB4);
但是仍然可以看到网页上呈现的字符,如
I–m
Ã、Ã、Ã、Ã、Ã、Ã、Ã等

有什么想法吗

*更新2*

运行上述步骤1和步骤2后,我有一个表列,如下所示:

`mysql:host=myhost;dbname=mydatabase;charset=utf8mb4`
`job_salary` VARCHAR(150) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
以下对此列的查询返回以下结果:

SELECT job_salary FROM tbl_jobs WHERE job_id = 2235;

€30,000 plus excellent benefits 
我在此列上执行以下语句:

UPDATE tbl_jobs SET job_salary = CONVERT(BINARY(CONVERT(job_salary  USING latin1)) USING utf8mb4);
但我得到以下错误,这意味着其他一些记录有一个无效的utf8mb4

Invalid utf8mb4 character string: '\x8010000 to \x8020000 Per: annum'

首先,让我们讨论一下欧元符号的莫吉贝克。所有这一切都适用于utf8和utf8mb4,因为欧元的编码方式是相同的,并且存在差异

很可能数据最初存储不正确。如果您可以回到
INSERT
程序,让我们检查一下:

  • 要存储的字节需要UTF-8编码。客户端编程语言是什么?这些数据来自哪里
  • 插入和选择文本时的连接需要指定utf8或utf8mb4。你有连接参数吗
  • 该列需要声明为字符集utf8(或utf8mb4)。这听起来似乎总是正确的
  • HTML应该以
表中当前的是什么

SELECT col, HEX(col) FROM ... WHERE ...
正确存储的欧元符号(
)应具有十六进制
E282AC
。(将其解释为拉丁文1会产生

相反,如果您看到hex
c3a2e2809ac2c
,则您有“双重编码”,并且显示可能是

我已经确定了几种可能的修复方法,但尚未确定哪种方法适用于您的情况。可能的候选方法是

  • 字符集utf8mb4
    采用双重编码:
要验证(在修复之前),请执行以下操作:

SELECT col,
       CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4),
       HEX(    
          CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4)
          )
    FROM ...
    WHERE ...

不要在另一个补丁上应用补丁。我一直在努力破解字符集问题是如何发生的,以及如何“修复”一个问题。但是当应用了错误的补丁时,我无法解开这个烂摊子。

-™是“Mojibake”;
是一个“黑钻石”--cf the dup Q&A.@RickJames感谢您提供到详细帖子的链接,非常有用。对于现有数据,简单地更改数据库和表排序规则并不会转换数据。那么,我更新的帖子是否是纠正旧数据的正确方法?是的--这些是数据库和表中新表和列的默认值。至于修复数据时,该页面上曾经有一个链接。这里是:。5个案例可以通过5种不同的方式修复;您没有提供足够的信息让我说出哪一个是正确的。@RickJames请查看我的更新帖子。在您提供链接之前,我已经运行了上述步骤。我现在是否对其进行双重编码?@RickJames原始字符集和排序规则是utf8_general_ci,我需要转换为utf8mb4,我需要做更多的挖掘并返回给您。同时,如何防止用户从输入中提交拉丁文字符。即使我将连接设置为utf8mb4,并将数据库/表/列设置为utf8mb4,提交
的用户仍将保存为表中的
,因此我们回到了第一步。即使将
accept charset=“utf-8”
添加到表单中,也会发生这种情况。@adam78-用户如何提交内容?通过HTML表单?直接连接到mysql?其他API?