当前位置: 首页 > 知识库问答 >
问题:

数据太长,无法出现带有国家/地区的列错误

鲁钱明
2023-03-14

我必须将一些DBS移植到运行在64位Windows7上的独立MySQL Version: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)

如您所见,缺少带有国家字符chE8h的条目。

我知道这些质量保证:

    < li >如何让MySQL正确处理UTF-8 < li >“列的数据太长”-为什么? < li >错误代码:1406。数据对于列太长- MySQL

但是它们没有解决这个问题(没有任何解决方案)。

即使对于单个字符字符串,也存在此问题。无论瓦尔查尔的大小如何。因此,目前唯一的解决方案是将国家字符更改为ASCII,但这会丢失我宁愿避免的信息。

我尝试使用各种字符集,但没有任何效果。

我尝试按照其他一些答案的建议删除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个答案

温举
2023-03-14

好吧,看看字符č代码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`;

这终于起作用了(愚蠢的我,我以为我以前已经尝试过了,但没有正确的结果)。所以我的错误是为非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选项也没有帮助)。由于我需要使用文件,我仍在寻找解决方案。但由于这是不同的问题,我决定提出新的问题:

  • 使用命令会损坏非 Unicode 文本编码
 类似资料:
  • 问题内容: 我已经下载了ip-to-country.csv,它具有映射到国家的ip范围。如何将这些数据存储到数据库中,如何查询IP地址的范围以了解IP地址从何而来? 问题答案: 我编写了一个名为ip2c的小程序库来完成此操作。它使用webhosting.info中的数据库,但也支持Software77中的数据库。 它将CSV信息转换为紧凑的二进制格式,并且可以直接在文件,内存或内存映射文件中进行搜

  • 我想要电话号码的国家代码列表。例如,美国(1),英国(44)...我知道libphonenumber是一个帮助手机解析、格式化和验证的好工具。然而,它似乎没有列出所有国家代码的功能。但是那些数据应该在libphonenumber的元数据中,对吗?有人有这方面的经验吗?

  • 我正在使用以下代码来收集与某个主题相关的推文,但在我提取的所有推文中,“places”属性为“无”。我做错了什么吗?此外,该代码旨在提取现有的推文,我不需要流式处理API解决方案,也不寻找流式处理API的这种解决方案:https://www.quora.com/How-can-I-get-a-stream-of-tweets-from-a-particular-country-using-Twit

  • 问题内容: 错误代码:1406。数据对于列而言太长 现在一些值 插入记录超过 如果我们的 它显示错误信息 错误代码:1406。数据对于列而言太长 但是我的期望是,我想在表中至少插入前45个字符 如果问题不清楚,请告诉我。 我知道此错误的原因。我正在尝试插入比数据类型长度更多的值。 我想要MySQL中的解决方案,因为它可能在中。所以我希望它也会出现在 MySQL中 。 问题答案: MySQL将截断任

  • 从我的应用程序注册表单中,我试图将复选框值插入到mysql表中,但它抛出错误1406 Data对于列来说太长了。复选框的值为 0 或 1。而我的表结构是,创建表测试(checkbox_response位(1))... 我经历了一些事情,找到了解决这个问题的方法。解决方案是,我刚刚更改了sql模式SET@@global。sql_mode=“”…正确插入后。 虽然“我的数据类型大小”适合复选框值,但为

  • 我已经编写了一个MySQL脚本,为假设的医院记录创建一个数据库,并用数据填充它。其中一个表Department有一个名为Description的列,该列声明为varchar(200)类型。对Description I执行INSERT命令时,出现错误: 错误1406:数据对于第1行的列“描述”来说太长。 我插入的所有字符串都小于150个字符。 以下是声明:< br > 下面是插入命令: 显然,这应该