2017-10-13 23 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選項也不起作用)。由於我需要使用文件,我仍在尋找解決方案。但是,因爲這是不同的問題,我決定向新的問題: