gpt4 book ai didi

mysql - 带有国家字符的列错误的数据太长

转载 作者:可可西里 更新时间:2023-11-01 10:42:15 26 4
gpt4 key购买 nike

我必须将一些 DBS 移植到在 Windows7 64bit 上运行的独立 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 的条目。

我知道这些 QA:

但他们没有解决这个问题(没有任何解决方案可以解决这个问题)。

即使是单个字符串也存在此问题。无论 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

最佳答案

好吧,看看 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`;

这终于奏效了(愚蠢的我,我以为我之前已经尝试过但没有正确的结果)。所以我的错误是为 Non 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++ 中完成。

如果不写这个问题,我可能会原地转几个小时甚至几天。希望这对其他人也有帮助。

[编辑1]

现在我遇到了另一个由 Windows 引起的问题。如果我使用剪贴板传递脚本或自己键入它,一切都可以,但如果我使用 source 文件,那么国家字符将出错(并且 -e 选项也无济于事)。由于我需要使用文件,所以我仍在寻找解决方案。但由于这是不同的问题,我决定提出新问题:

关于mysql - 带有国家字符的列错误的数据太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46727013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com