2017-10-13 7 views
2

je dois le port une DBS en stand alone MySQL Version: 5.0.18 courir sur Windows7 64bit et moi avons eu un problème, je suis coincé avec. Si je tente d'insérer un caractère national/unicode dans varchar Je suis erreur:données trop long pour erreur de colonne avec des caractères nationaux

ERROR 1406 (22001): Data too long for column 'nam' at row 1 

Ici MCVE script 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`; 

Et ici la sortie:

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) 

Comme vous pouvez voir l'entrée avec le caractère national čE8h est manquant.

Je suis au courant de ces QAs:

mais ils ne traitent pas ce problème (pas de solution de l'un de ces travaux pour ce).

Ce problème est présent même pour les chaînes de caractères simples. Peu importe la taille de VARCHAR. Donc la seule solution pour l'instant est de changer les caractères nationaux en ASCII mais cela perdrait des informations que je préférerais éviter.

J'ai essayé d'utiliser différents jeux de caractères utf8, ucs2, latin1 sans aucun effet.

J'ai essayé de supprimer le comme le suggèrent d'autres réponses, mais cela n'a aucun effet sur ce point (et la taille de la chaîne est plusieurs fois plus grande que nécessaire).

Quelqu'un a des indices?Peut-être qu'il a quelque chose à voir avec ce que ce serveur MySQL est autonome (il est pas installé) est démarré avec ce 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 

et les requêtes sont effectuées à l'intérieur de la console a commencé comme ça cmd:

@echo off 
    bin\mysql.exe -uroot -h127.0.0.1 -P3306 
rem bin\mysql.exe -uroot -proot -h127.0.0.1 -P3306 
+1

Vous devez mettre à jour! 5.0.18 a presque 12 ans. 5.1, 5.5, 5.6, 5.7 et 8.0 ont apporté des modifications à la gestion des caractères non-ascii. Je vois de votre auto-réponse que vous avez esquivé la balle cette fois. –

Répondre

0

regardant bien au charbon č Code E8h (en question par écrit) Il ne ressemble pas à UTF8 mais ra Ther un ASCII (code ci-dessus 7Fh) qui m'a finalement fait essayer ce scénario MySQL étendu:

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`; 

Ce qui fonctionne enfin (silly me je pensais que je l'ai déjà essayé avant sans résultat correct). Donc, mon erreur était de forcer Unicode (qui a été défini par défaut) pour Non Unicode chaînes (qui je pense devrait fonctionner). Voici le résultat:

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) 

Mais comme vous pouvez le voir il y a un certain décalage dans la mise en forme de table, mais qui n'a pas d'importance autant que la présentation se fera dans C++ de toute façon.

Sans écrire cette question, j'irais probablement dans les cercles pendant des heures ou même des jours. Espérons que cela aide les autres aussi.

[Edit1]

Maintenant, j'ai eu un autre problème causé par Windows. Si je passe le script avec le Presse-papiers ou que je le tape moi-même tout est OK mais si j'utilise le fichier source alors les caractères nationaux vont mal tourner (et l'option -e ne sert à rien non plus). Comme j'ai besoin d'utiliser des fichiers, je suis toujours à la recherche de solutions. Mais j'ai décidé que ce problème est différent à poser une nouvelle question: