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

问题描述

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

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

注意:我正在使用phpmyadmin进行更改。为什么会出现此错误?我以为utf8mb4_bin可以支持它吗?

解决方法

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

对其中具有非Ascii字符的某些标题执行SELECT title,HEX(title) ...

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

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

  • 该列需要更改为CHARACTER SET utf8(或utf8mb4)。但是,这样做是正确的,而且会使事情变得更糟。在讨论哪个是正确的之前,让我们看一下十六进制。
  • 控制{em> client 使用的编码的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;

将转换表t中的 all 文本列。

仅更改一列:

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...