【问题标题】:Data too long for column error with national characters数据太长导致列错误与国家字符
【发布时间】:2018-03-25 10:02:54
【问题描述】:

我必须将一些 DBS 移植到在 Windows7 64bit 上运行的独立 MySQL 版本:5.0.18,我遇到了问题坚持。如果我尝试在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 的条目。

我知道这些 QA:

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

即使是单个字符串也存在此问题。不管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

【问题讨论】:

  • 你应该升级! 5.0.18 快 12 岁了。 5.1、5.5、5.6、5.7 和 8.0 对非 ASCII 字符的处理进行了更改。我从你的自我回答中看出你这次躲过了子弹。

标签: mysql windows utf-8


【解决方案1】:

看看字符č代码E8h(写问题时)它看起来不像UTF8,而是一个扩展的ASCII(上面的代码@987654324 @) 最终让我尝试这个 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`;

这终于奏效了(愚蠢的我以为我之前已经尝试过但没有正确的结果)。所以我的错误是对 Non 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 选项也无济于事)。由于我需要使用文件,我仍在寻找解决方案。但由于这是不同的问题,我决定提出新问题:

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2015-07-10
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多