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可以支持?
您的道路崎岖不平。十六进制 E4
与 Psi
无关。它来自哪里?
对其中包含 non-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;
将转换 所有 table t
中的文本列。
仅更改一列:
ALTER TABLE t MODIFY COLUMN c VARCHAR(...)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
它必须包含您没有的所有其他内容(例如,NULL 或 NOT NULL)。
我的一个专栏有特殊字符,例如 latin1_swedish_ci 似乎不支持的“Ψ”。为了处理这种情况,我尝试将一列的排序规则切换为 utf8mb4_bin。但是在转换数据时我得到:
Query error:
#1366 - Incorrect string value: '\xE4' for column 'title' at row 18
注意:我正在使用 phpmyadmin 来更改它。为什么我会收到此错误?我以为utf8mb4_bin可以支持?
您的道路崎岖不平。十六进制 E4
与 Psi
无关。它来自哪里?
对其中包含 non-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;
将转换 所有 table t
中的文本列。
仅更改一列:
ALTER TABLE t MODIFY COLUMN c VARCHAR(...)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
它必须包含您没有的所有其他内容(例如,NULL 或 NOT NULL)。