我必须将一些dbs移植到独立的mysql版本:5.0.18,运行在windows7 64bit上,我遇到了一个问题。如果我试图在varchar中插入任何国家/Unicode字符,则出现错误:

ERROR 1406 (22001): Data too long for column 'nam' at row 1

这里是mcve sql脚本:
SET NAMES utf8;

DROP TABLE IF EXISTS `tab`;
CREATE TABLE `tab` (`ix` INT default 0,`nam` VARCHAR(1024) default '' ) DEFAULT CHARSET=utf8;
INSERT INTO `tab` VALUES (1,'motorček');
INSERT INTO `tab` VALUES (2,'motorcek');
SELECT * FROM `tab`;

这里输出:
mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS `tab`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE `tab` (`ix` INT default 0,`nam` VARCHAR(1024) default '' ) DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `tab` VALUES (1,'motorček');
ERROR 1406 (22001): Data too long for column 'nam' at row 1
mysql> INSERT INTO `tab` VALUES (2,'motorcek');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM `tab`;
+------+----------+
| ix   | nam      |
+------+----------+
|    2 | motorcek |
+------+----------+
1 row in set (0.00 sec)

如您所见,缺少带有国家字符čE8h的条目。
我知道这些质量保证:
How to make MySQL handle UTF-8 properly
“Data too long for column” - why?
Error Code: 1406. Data too long for column - MySQL
但是他们没有解决这个问题(没有任何解决方案)。
即使是单个字符串也存在此问题。无论VARCHAR的大小。所以目前唯一的解决方案是将国家字符转换成ascii,但这将丢失我宁愿避免的信息。
我试着使用不同的字符集,但没有任何效果。
我试着像其他一些答案所暗示的那样去掉utf8, ucs2, latin1,但这也没有效果(而且字符串的大小比需要的大很多倍)。
有人有线索吗?可能与此MySQL服务器是独立的(未安装)有关,它是用以下命令启动的:
@echo off

bin\mysqld --defaults-file=bin\my.ini --standalone --console --wait_timeout=2147483 --interactive_timeout=2147483

if errorlevel 1 goto error
goto finish

:error
echo.
echo MySQL could not be started
pause

:finish

查询在控制台内完成,启动方式如下:
@echo off
    bin\mysql.exe -uroot -h127.0.0.1 -P3306
rem bin\mysql.exe -uroot -proot -h127.0.0.1 -P3306

最佳答案

好吧,看看charčcodeE8h(在编写问题时)它看起来不像utf8,而是一个扩展的ascii(上面的代码7Fh),它最终让我尝试了这个mysql脚本:

SET NAMES latin1;
DROP TABLE IF EXISTS `tab`;
CREATE TABLE `tab` (`ix` INT default 0,`nam` VARCHAR(1024) default '' );
INSERT INTO `tab` VALUES (1,'motorček');
INSERT INTO `tab` VALUES (2,'motorcek');
SELECT * FROM `tab`;

终于成功了(我真傻,我以为我以前已经试过了,但没有正确的结果)。所以我的错误是对非unicode字符串强制使用unicode(它被设置为默认值)(我认为应该可以)。结果如下:
mysql> SET NAMES latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS `tab`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE `tab` (`ix` INT default 0,`nam` VARCHAR(1024) default '' );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO `tab` VALUES (1,'motorček');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `tab` VALUES (2,'motorcek');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM `tab`;
+------+----------+
| ix   | nam      |
+------+----------+
|    1 | motorček  |
|    2 | motorcek |
+------+----------+
2 rows in set (0.00 sec)

但是,正如你所看到的,表格格式有一些差异,但这并不重要,因为演示文稿将在C++中完成。
如果不写这个问题,我可能会绕几个小时甚至几天圈子。希望这也能帮助其他人。
[编辑1]
现在我又遇到了一个由windows引起的问题。如果我用剪贴板传递脚本或自己键入脚本都可以,但如果使用source文件,则民族字符将出错(而且-e选项也没有帮助)。由于我需要使用文件,我仍然在寻找解决方案。但由于这是不同的问题,我决定问一个新问题:
Using source command corrupts non Unicode text encoding

07-26 09:37
查看更多