2017-10-13 1 views
2

Ich habe in dem Hafen einige DBS in Stand-alone-MySQL Version: 5.0.18 läuft auf Windows7 64bit und ich habe ein Problem, das ich mit steckte. Wenn ich versuche, jede nationale/Unicode-Zeichen in varchar einzufügen habe ich Fehler:Daten zu langen Spalte Fehler mit nationalen Zeichen

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

Hier MCVE SQL-Skript:

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

Und hier Ausgang:

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) 

Wie Sie den Eintrag mit nationalen Zeichen čsehen können 210 fehlt.

Ich bin mir bewusst, dieser QAs:

aber sie befassen sich nicht mit diesem Problem (keine Lösung aus diesen Arbeiten für Dies).

Dieses Problem ist auch für einzelne Zeichenfolgen vorhanden. Egal die Größe von VARCHAR. Also die einzige Lösung für jetzt ist, ändern Sie die nationalen Zeichen in ASCII aber das würde Informationen verlieren, die ich lieber vermeiden würde.

Ich habe versucht, verschiedene Zeichensätze utf8, ucs2, latin1 ohne Wirkung zu verwenden.

Ich habe versucht, die STRICT_TRANS_TABLES fallen lassen, wie einige der anderen Antworten vorschlagen, aber das hat auch keinen Effekt mit diesem (und die String-Größe ist viel größer als nötig).

Hat jemand irgendwelche Hinweise?Vielleicht ist es etwas mit der Tat zu tun hat, dass diese MySQL Server Standalone ist (es nicht installiert ist) es mit diesem cmd gestartet:

@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 

und Abfragen sind fertig innerhalb Konsole ähnliche cmd gestartet:

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

sollten Sie aktualisieren! 5.0.18 ist fast 12 Jahre alt. 5.1, 5.5, 5.6, 5.7 und 8.0 haben Änderungen an der Handhabung von nicht-ASCII-Zeichen vorgenommen. Ich sehe aus deiner Selbstantwort, dass du dieses Mal der Kugel ausgewichen bist. –

Antwort

0

Well an dem char sucht č Code E8h (während Frage Schreiben) Es sieht nicht wie UTF8 aber ra ther eine erweiterte ASCII (Code über 7Fh), die mich schließlich wies diese MySQL Skript, um zu versuchen:

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

die schließlich arbeitet (dumm von mir dachte ich, dass ich es schon vorher versucht, ohne richtiges Ergebnis). So war mein Fehler zu erzwingen Unicode (die als Standard festgelegt wurde) für nicht Unicode Strings (die ich denke, sollte funktionieren). Hier das Ergebnis:

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) 

Aber wie Sie es sehen können, ist eine gewisse Diskrepanz in der Tabellenformatierung, aber das spielt keine große Rolle, wie die Präsentation in C++ ohnehin durchgeführt werden.

Ohne diese Frage zu schreiben, würde ich wahrscheinlich für Stunden oder sogar Tage im Kreis gehen. Hoffentlich hilft das auch anderen.

[Edit1]

Jetzt habe ich ein anderes Problem von Windows-verursacht. Wenn ich das Skript mit Zwischenablage übergebe oder es selbst schreibe, ist alles in Ordnung, aber wenn ich source Datei verwende, dann werden die nationalen Zeichen falsch gehen (und die Option -e hilft auch nicht). Da ich Dateien verwenden muss, suche ich immer noch nach einer Lösung. Da dies aber anderes Problem ist habe ich beschlossen, neue Frage:

Verwandte Themen