问题描述
我的一列中有latin1_swedish_ci似乎不支持的特殊字符,例如“Ψ”。为了处理这种情况,我尝试将第一列的排序规则切换为utf8mb4_bin。但是当转换数据时我得到:
Query error:
#1366 - Incorrect string value: '\xE4' for column 'title' at row 18
注意:我正在使用phpmyadmin进行更改。为什么会出现此错误?我以为utf8mb4_bin可以支持它吗?
解决方法
您正走在一条崎y的道路上。十六进制E4
与Psi
无关。它是从哪里来的?
对其中具有非Ascii字符的某些标题执行SELECT title,HEX(title) ...
。
psi的UTF-8编码是两个十六进制字符CEA8
。
E4
,当解释为latin1
时表示ä
。那有意义吗?
- 该列需要更改为
CHARACTER SET utf8
(或utf8mb4
)。但是,这样做是正确的,而且会使事情变得更糟。在讨论哪个是正确的之前,让我们看一下十六进制。 - 控制{em> client 使用的编码的
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
中的 all 文本列。
仅更改一列:
ALTER TABLE t MODIFY COLUMN c VARCHAR(...)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
它必须包含您没有的所有其他内容(例如NULL或NOT NULL)。