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

Posted

技术标签:

【中文标题】Mysql 将排序规则从 latin1_swedish_ci 更改为 utf8mb4_bin【英文标题】:Mysql changing the collation from latin1_swedish_ci to utf8mb4_bin 【发布时间】:2021-01-28 09:24:06 【问题描述】:

我的一个专栏有特殊字符,例如 latin1_swedish_ci 似乎不支持的“Ψ”。为了处理这种情况,我尝试将排序规则切换为 utf8mb4_bin 的一列。但是在转换我得到的数据时:

Query error:
#1366 - Incorrect string value: '\xE4' for column 'title' at row 18

注意:我正在使用 phpmyadmin 来更改它。为什么我会收到此错误?我以为 utf8mb4_bin 可以支持吗?

【问题讨论】:

Character Sets and Collations in mysql. "转换时" -- 你可以放弃转换吗?执行了什么 SQL?有几种可能的方法——大多数都会引起麻烦。您可能必须执行正确的 SQL,而不是依赖 UI 才能正确执行。 【参考方案1】:

你正走在一条崎岖的道路上。十六进制 E4Psi 无关。它是从哪里来的?

在某些包含非 Ascii 字符的标题上执行 SELECT title, HEX(title) ...

psi 的 UTF-8 编码是两个十六进制字符 CEA8

E4,当解释为latin1 时代表ä。这有意义吗?

该列需要更改为CHARACTER SET utf8(或utf8mb4)。但是有一种正确的方法可以做到这一点,并且有一种方法会使事情变得更糟。在讨论哪个是正确的之前,让我们先看看 HEX。 VARIABLEs 控制 客户端 使用什么编码。切换编码时需要更改多项设置。

更多参考资料:

http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases Trouble with UTF-8 characters; what I see is not what I stored

没有字符集将 E4 映射到 Psi:

cp1250, cp1257, dec8, latin1, latin2, latin5, latin7  25 24
                                                     'Kaze no Tani no Nausicaä'
                                        cp852  25 24 'Kaze no Tani no Nausicań'
                                        cp850  25 24 'Kaze no Tani no Nausicaõ'
                                        macce  25 24 'Kaze no Tani no Nausicaš'
                                          hp8  25 24 'Kaze no Tani no Nausicað'
                                        greek  25 24 'Kaze no Tani no Nausicaδ'
                                      keybcs2  25 24 'Kaze no Tani no NausicaΣ'
                                       cp1251  25 24 'Kaze no Tani no Nausicaд'
                                 koi8r, koi8u  25 24 'Kaze no Tani no NausicaД'
                                        cp866  25 24 'Kaze no Tani no Nausicaф'
                                     armscii8  25 24 'Kaze no Tani no NausicaՊ'
                                       hebrew  25 24 'Kaze no Tani no Nausicaה'
                                       cp1256  25 24 'Kaze no Tani no Nausicaن'
                                       tis620  26 24 'Kaze no Tani no Nausicaไ'
                                      geostd8  26 24 'Kaze no Tani no Nausicaჰ'
                                     macroman  26 24 'Kaze no Tani no Nausica‰'

所以,我担心犯了两个错误。你有另一个错误文本的例子吗?

Latin1 不能处理希腊字母。也不是西里尔文。也不是中文。等等 那么,ä 是“正确的”吗? (我一直在追问如何在 E4 和 Psi 之间切换。)

所以你可能应该转换为 utf8mb4。

ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

将转换所有t中的文本列。

仅更改一列:

ALTER TABLE t MODIFY COLUMN c VARCHAR(...)
     CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

它必须包含您没有的所有其他内容(例如,NULL 或 NOT NULL)。

【讨论】:

当我做select title, HEX(title) from tablename 时,我得到了一堆行。包含ä 的标题具有4B617A65206E6F2054616E69206E6F204E617573696361E4 的十六进制(标题) @LTM - 我添加到我的答案中。 utf8mb4 将支持 Psi,而不是 E4。我们需要找到一种安全的方式将您的文本转换为 utf8mb4;我(还)没有看到安全的方法。 我在这里可能有误会。但我不是在寻找将 E4 映射到 Psi 的字符集。基本上发生的事情是,最初我的默认排序规则是 latin1_swedish_ci。这对我有用。我能够插入 Kaze no Tani no Nausicaä 错误。但是当我尝试在latin1_swedish_ci 列中插入带有Ψ 的标题时,typeORM 报错并没有插入Ψ。我想这可能是因为latin1_swedish_ci 不能代表Ψ。所以从那里开始,为了在数据库中插入Ψ,我尝试将排序规则更改为utf8mb4。这导致我的帖子出现错误。 所以我要找的基本上是两件事:1. 一个字符集,可以让我同时拥有Ψ 和大多数其他类型的字符。 2. 一种将我的 latin1_swedish_ci 更改为该字符集/排序规则的方法。我的数据没有损坏(据我所知)。当你说Hex E4 has nothing to do with Psi 我同意。我的问题不是我希望 E4 成为Ψ。我只想要一个字符集和一种将标题列转换为该字符集的方法。 @LTM - 是的,我发现了一棵不同的树。我更新了我的答案。

以上是关于Mysql 将排序规则从 latin1_swedish_ci 更改为 utf8mb4_bin的主要内容,如果未能解决你的问题,请参考以下文章

在 mySQL 中非法混合排序规则

MySQL排序顺序 - 排序规则?

有没有办法将所有现有的表数据转换为 UTF8 排序规则?

创建自定义 MySQL 排序规则

sh WordPress:将MySQL排序规则从utf8mb4转换为utf8的脚本(通过http://ben.lobaugh.net/blog/201740/script-to-convert-mys

所有语言的 MySQL 排序规则