gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:15:48 25 4
gpt4 key购买 nike

我有一个数据库,其中包含 latin1 默认字符集 - 通过运行以下语句获得的信息:

  SELECT default_character_set_name FROM information_schema.SCHEMATA 

WHERE schema_name = "schemaname";

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

当我查看表中的数据时,我可以看到数据存储为 utf8,例如货币符号 在表中存储为 € 。同样,撇号存储为 ’等等

在网络前端,我有以下元标记,因此字符呈现正确。

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

但是我还在网页上看到很多 � 符号,但我在数据库中看不到?

当我更改数据库连接以包含字符集 utf8 时,如下所示:mysql:host=myhost;dbname=mydatabase;charset=utf8 ,菱形符号消失,但随后所有其他 utf8字符完全恢复为它们在数据库中的保存方式,例如符号呈现为 €在网页上?

为什么会发生这种情况?

  1. 如何修复此问题并将字符集更改为 utf8mb4?

感谢任何帮助。

* 更新 *

尝试了以下步骤:

  1. 对于数据库:

    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

  2. 对于每个表:

    ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

  3. 对于每列:

    ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

不确定第 3 步是否必要,因为我这样做 SHOW CREATE TABLE在步骤 2 之后,虽然定义不显示列字符集,但它确实将表的默认字符集显示为 utf8mb4。作为一项健全性检查,我确实在表列之一上运行了步骤 3,但这没有什么区别 - €在页面上呈现为 €数据库连接如下:

`mysql:host=myhost;dbname=mydatabase;charset=utf8mb4`

我必须在我想要转换的每一列上运行以下命令,这似乎解决了一些问题

 UPDATE tbl_profiles SET profile =
convert(cast(convert(profile using latin1) as binary) using UTF8MB4);

但仍然看到诸如Iâm之类的字符和«Ââ¢呈现在网页上

有什么想法吗?

*更新2*

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

`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'

最佳答案

首先,我们来讨论一下欧元符号的 Mojibake。所有这些都适用于 utf8 和 utf8mb4,因为欧元的编码方式与相同。

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

  • 要存储的字节需要采用 UTF-8 编码。客户端编程语言是什么?数据从哪里来?
  • INSERTing和SELECTing文本时的连接需要指定utf8或utf8mb4。有连接参数吗?
  • 该列需要声明为字符集 utf8(或 utf8mb4)。听起来这总是正确的。
  • HTML 应以 . 开头

当前表中有什么?

SELECT col, HEX(col) FROM ... WHERE ...

正确存储的欧元符号 () 应为十六进制 E282AC。 (将其解释为 latin1 会产生

如果您看到十六进制 C3A2E2809AC2AC,则说明您具有“双重编码”,并且显示的内容可能是 ‚ÂØ

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

  • 字符集 utf8mb4 具有双重编码:

要验证它(在修复它之前),请执行以下操作:

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

请勿在另一个修复之上应用修复。很长一段时间以来,我一直在努力破译字符集问题是如何发生的以及如何“修复”单个问题。但是当应用了错误的修复时,我就无法解决这个困惑的问题。

关于MySQL - utf8 字符在 Web 前端无法正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59698300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com