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

Mysql changing the collation from latin1_swedish_ci to utf8mb4_bin

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

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

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

您的道路崎岖不平。十六进制 E4Psi 无关。它来自哪里?

对其中​​包含 non-Ascii 字符的某些标题执行 SELECT title, HEX(title) ...

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

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

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

更多参考:

没有字符集将 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;

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

仅更改一列:

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

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