2017-10-13 24 views
2

我有口一些DBS成独立的MySQL版本:5.0.18上Windows7的64位运行,我有一个问题,我坚持。如果我尝试插入任何国家/ 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缺失。

我知道这些的问题答案的:

但他们没有任何对那些工作解决这个问题(无解这个)。

即使对于单个字符串,也存在此问题。无论大小为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

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

回答

0

那么看着炭č代码E8h(而写的问题),它看起来并不像UTF8但RA疗法一延伸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字符串(我认为应该工作)。这里的结果:

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选项也不起作用)。由于我需要使用文件,我仍在寻找解决方案。但是,因为这是不同的问题,我决定向新的问题: