MySQL 四字节中文字符支持

8

我无法执行这个SQL脚本:

INSERT INTO `mabase`.`new_table` (`idnew_table`, `name`) VALUES ('2', '');

错误信息如下:
ERROR 1366: 在第一行的'name'列中插入了一个不正确的字符串值:'\xF0\xA0\xBC\xAD' SQL语句: INSERT INTO mabase.new_table (idnew_table, name) VALUES ('2', '')
我的数据库和表使用utf8字符集和utf8_general_ci排序规则。 我也尝试过以下排序规则: utf8_unicode_ci, utf8mb4_general_ci, bg5_cinese_ci, gbk_cinese_ci。
我在Windows上使用MySql Workbench尝试了所有这些方法,但只有四字节字符会出现问题。 请告诉我如何在mysql中保存四字节字符。

可能是MySQL抛出“Incorrect string value”错误的重复问题。 - Danack
2个回答

11

你所需要的字符U+20F2D位于Unicode的“补充表意文字平面”的“CJK统一表意文字扩展B”块中,因此在MySQL v5.5之前的任何Unicode字符集中都不可用;从v5.5开始,它可在utf8mb4, utf16, utf16leutf32字符集中使用。

它不可在MySQL的big5gbk字符集中使用。


为什么utf8编码无法工作

正如Unicode Support所记录的:

MySQL 4.1实现Unicode支持的最初版本包括两个字符集来存储Unicode数据: ucs2,使用每个字符16位的UCS-2编码的Unicode字符集。 utf8,使用每个字符1到3个字节的UTF-8编码的Unicode字符集。 这两个字符集支持Unicode Version 3.0的基本多语言平面(BMP)中的字符。BMP字符具有以下特点: 它们的代码值介于0和65535之间(或 U+0000 .. U+FFFF)。 它们可以用一个固定的16位单词进行编码,如ucs2。 它们可以用8、16或24位进行编码,如utf8。 它们足以表示几乎所有主要语言中的字符。 不受前述字符集支持的字符包括位于BMP之外的补充字符。 BMP之外的字符在转换为Unicode字符集时将比较为替换字符,并转换为“?”。 在MySQL 5.6中,Unicode支持包括补充字符,这需要具有更广泛范围且因此占用更多空间的新字符集。下表显示了先前和当前Unicode支持的简要功能比较。 这些更改是向上兼容的。如果您想使用新的字符集,则可能会对您的应用程序产生不兼容性问题;请参见“Section 10.1.11,“从以前的Unicode支持升级到当前版本””。该部分还描述了如何将表从utf8转换为(4字节)utf8mb4字符集以及在这样做时可能适用的约束条件。

为什么big5编码不起作用

正如使用Big5中文字符集时应注意哪些问题?中所记录的:

MySQL支持在香港和台湾(中华民国)常见的Big5字符集。MySQL的big5实际上是Microsoft代码页950,它非常类似于原始的big5字符集。

[ 差异部分已删除 ]

一个添加HKSCS扩展功能的特性请求已被提交。需要此扩展功能的人们可能会发现与Bug #13577相关的建议修补程序很有帮助。

为什么gbk编码不起作用

正如MySQL中有哪些CJK字符集可用?中所记录的:

在这里,我们试图通过参考官方文档来澄清哪些字符在gb2312gbk中是合法的。请在报告gb2312gbk错误之前检查这些参考资料。

  • 按照gb2312_chinese_ci排序,列出了所有gb2312字符的完整列表: gb2312

  • MySQL的gbk实际上是“Microsoft代码页936”。这与官方的gbk不同,对于字符A1A4(中点)、A1AA(长破折号)、A6E0-A6F5A8BB-A8C0有所不同。

  • 有关gbk/Unicode映射的列表,请参见http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP936.TXT

  • 有关MySQL的gbk字符的列表,请参见gbk


你好,感谢您提供这么好的答案,但我仍需要帮助。 我已经在服务器5.5和5.7 alpha上尝试了此脚本,但它失败了: CREATE SCHEMA new_schema DEFAULT CHARACTER SET utf8mb4 ; CREATE TABLE new_schema.new_table ( idnew_table INT NOT NULL , new_tablecol VARCHAR(45) CHARACTER SET 'utf8mb4' NULL , PRIMARY KEY (idnew_table) ) DEFAULT CHARACTER SET = utf8mb4; INSERT INTO new_schema.new_table (idnew_table, new_tablecol) VALUES ('1', ''); 我是从Workbench执行的。 - yaroslav prokipchyn
1
@yaroslavprokipchyn:我认为你会发现是Workbench无法处理补充字符。我相信它在内部使用UTF-8,因此将utf8设置为其数据库连接的字符集(即使它可能支持utf8mb4,这表明这很可能是一个错误),这就是为什么MySQLd抱怨接收到的字符串无效的原因。你可以尝试SET NAMES 'utf8mb4';,但是Workbench可能不喜欢你尝试覆盖其预期的字符集。否则,使用INSERT INTO new_table VALUES (1, _utf8mb4''); - eggyal
1
一个带有丰富参考资料的好答案,肯定值得更多的赞。 - Danubian Sailor

0

这两个命令将支持您数据库中的中文字符。

ALTER DATABASE CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci'

ALTER TABLE convert to character set DEFAULT COLLATE DEFAULT

简短明了。

希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接