我必须将一些 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
答案 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选项也没有用)。由于我需要使用文件,我仍在寻找解决方案。但由于这是另一个问题,我决定提出新问题: