对于具有国家字符的列错误,数据太长

时间:2017-10-13 09:43:35

标签: mysql windows utf-8

我必须将一些 DBS 移植到 Windows版64位上独立 MySQL版本:5.0.18 ,我遇到了问题我是坚持。如果我尝试将任何国家/ unicode字符插入varchar我收到错误:

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的条目。

我知道这些QAs:

但他们没有解决这个问题(没有任何解决方案可以解决这个问题。)

即使对于单个字符串,也存在此问题。无论VARCHAR的大小。因此,目前唯一的解决方案是将国家字符更改为 ASCII ,但这会丢失我宁愿避免的信息。

我尝试使用各种字符集utf8, ucs2, latin1而没有任何效果。

我尝试删除STRICT_TRANS_TABLES,因为其他一些答案建议,但这对此没有影响(字符串大小比需要的大很多倍)。

有没有人有任何线索?可能与此 MySQL 服务器是独立的(未安装)事实有关,它是以 cmd 启动的:

@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

并在控制台内完成查询,就像 cmd

一样
@echo off
    bin\mysql.exe -uroot -h127.0.0.1 -P3306
rem bin\mysql.exe -uroot -proot -h127.0.0.1 -P3306

1 个答案:

答案 0 :(得分:0)

仔细查看char č代码E8h(在撰写问题时)它看起来不像 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 ++ 中完成。

如果不写这个问题,我可能会花几个小时甚至几天。希望这也有助于其他人。

<强> [EDIT1]

现在我遇到了由Windows引起的另一个问题。如果我用剪贴板传递脚本或者自己键入它一切都没问题,但如果我使用source文件,那么国家字符就会出错(-e选项也没有用)。由于我需要使用文件,我仍在寻找解决方案。但由于这是另一个问题,我决定提出新问题: