将 MySQL 字段字符集从 latin1 更改为 utf8_general_ci 会破坏元音变音 (ä,ö,ü)

Posted

技术标签:

【中文标题】将 MySQL 字段字符集从 latin1 更改为 utf8_general_ci 会破坏元音变音 (ä,ö,ü)【英文标题】:Change MySQL Field Charset from latin1 to utf8_general_ci breaks umlauts (ä,ö,ü) 【发布时间】:2021-12-17 18:30:03 【问题描述】:

我正在构建一个以前必须处理英语和德语文本的应用程序。现在我也添加了将文本翻译成俄语和中文的功能。但似乎西里尔文和中文字符无法保存在默认的 lating1 字符集中。我使用 phpMyAdmin 将我的字符集切换为 utf8_general_ci。它可以查找,我可以使用每个需要的字符保存新内容。

问题在于,每个像 ä,ö,ü 这样的旧变音符号都被替换为 ?。 它是有线的,因为如果我再次输入变音符号以将其保存到数据库中,它可以正常工作。所以字符集的变化似乎把每个变音符号都变成了“?”。

有人可以指出我可以更改字符集但不破坏所有旧内容的方向吗?

谢谢!

【问题讨论】:

【参考方案1】:

有很多方法可以“更改”正在使用的字符集。每个都适用于一种情况,但会使情况更糟适用于其他情况。

不幸的是,您处于所有情况中最糟糕的情况——数据消失了,取而代之的是“?”。

如果您可以重新加载数据,请使用this 分析情况并使用this 确定适当的修复方法。

由于您要存储中文,因此您必须以 CHARACTER SET utf8mb4 结尾,而不仅仅是 utf8。 (包括英语、西里尔语和德语。)

如果您想了解更多具体信息,我需要更多详细信息:SHOW CREATE TABLESELECT HEX(..) 来自第一个链接等。

一些字符集更改需要更改位。以ä 为例:

                  Character set(s)         HEX encoding

                            utf8mb4, utf8  C3A4
                 cp1250, cp1257, dec8,
           latin1, latin2, latin5, latin7  E4
                    cp850, cp852, keybcs2  84
                            eucjpms, ujis  8FABA3
                                  gb18030  81308A31
                                      hp8  CC
                          macce, macroman  8A
                                     swe7  7B

英文字母在大多数字符集之间不会改变。重音字母 - 混合体。

utf8 是 utf8mb4 的子集 大多数“latin*”字符集有一些重叠或缺少字符。 Ascii 不包含任何重音字母,因此转换为它可能会产生“?”。

【讨论】:

我有所有数据的备份,我只需要知道如何在不破坏“旧”数据的情况下更改字符集。谢谢! @jDoe - 我添加了更多;它在某种程度上解决了您的评论。

以上是关于将 MySQL 字段字符集从 latin1 更改为 utf8_general_ci 会破坏元音变音 (ä,ö,ü)的主要内容,如果未能解决你的问题,请参考以下文章

mysql将默认字符集latin1更改为utf8

Mysql 将排序规则从 latin1_swedish_ci 更改为 utf8mb4_bin

如何将数据库中的所有字段从 latin1_swedish_ci 更改为 utf8_general_ci?

如何将所有行的排序规则从 latin1_swedish_ci 更改为 utf8_unicode_ci?

为啥我的 View 是 utf8 以及如何将其更改为 latin1

尝试将 MYSQL 的表字段类型从 BLOB 更改为 JSON