`
freesea
  • 浏览: 128900 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于MySql5“data too long for column”问题的探解

阅读更多

来源:http://blog.sina.com.cn/s/blog_53b0d5dc0100097v.html

 今天在windows的DOS窗口下运行mysql命令,insert语句中只要含有汉字数据就出现“data too long for column”错误 。

后来在网上查到一篇帖子 ( http://www.blogjava.net/sakis/archive/2006/07/14/58242.html ),内容如下:

关于MySql5的“data too long for column”错误

从MySql5中运行本地脚本创建数据库,当插入中文字段时发生“data too long for column”错误。上网一查,发现多字节用户大都碰到了这种情况。google搜索网上的解决方法大都是要将数据库的编码方式为GBK或UTF8,可我在安装MySql时就选择了UTF8格式。原来错误原因是本地的脚本文件不是UTF8编码的,用记事本或UltraEdit将编码转为UTF8后问题解决。再次强调,JSP页面,数据库联接接方式,数据库创建,…,都须一致使用UTF8编码!

BTW,MySql最近借着Web2.0的浪潮风头很劲啊,techn orati(好像这几天被GFW filter了),flickr,del.icio.us等一批网站都是用了MySql。MySql还专门在首页开了一大块来炫耀。

--------------------------------------------

按照他说的方法,通过source命令或者管道导入sql文件是没错了。但在Console/DOS窗口下运行insert语句带汉字还是会出现错误,为什么?经过一番测试,总结出这样的经验:
Console下调用程序发出的指令是通过一种编码格式编码之后发送出去的字符串,接收程序返回的信息同样也使用编码过的字符流。

例如我们要调用:

rename 1.txt 测试.txt

dos下把这行命令用某种编码方式编码成字符串,如果renmae命令接收到这个命令字符串,但错误的理解了这个命令参数的编码,或者console发送这个命令时使用了utf8编码,而renmae认为是gbk编码,则该命令会把文件重命名成乱码的名字。(因为中文windows下编码默认都是gbk,所以我们从来没遇到过这样的乱码问题。在dos窗口左上角右键-->属性,当前代码页: 936 (ANSI/OEM - 简体中文 GBK )验证DOS窗口是GBK编码发送字符)

 

但是,进入mysql命令之后,mysql命令可并不一定知道你发送的指令是GBK编码的,它可能认为你发送的指令是utf8编码,或者跟数据库编码一致的编码,或者跟某个全局变量一致的编码的指令字符串( mysql默认用什么编码接收指令,我没有研究清楚,请看官补充 )。所以这时候为了避免mysql误解你的指令编码,需要在调用mysql的时候加上--default-character-set=gbk 的参数。即 使用 mysql -uroot -p --default-character-set=gbk 登录即可。 注意,不要因为你的数据库是utf8编码就使用mysql -uroot -p --default-character-set=utf8去登录。我们这里说的是dos中发出的指令字符串的编码,dos窗口是不会用utf8编码去发送指令的。

 

当然,假设某个console发出的指令是通过utf8字符编码的,是不是应该用
mysql -uroot -p --default-character-set=utf8 ?没有试过,但分析应如此。

 

为什么用MYSQL-Front/SQLyog这样的GUI程序执行同样的sql就没有问题呢?在mysql-front/SQLyog登录时,就可以指定连接字符集,我猜想,登录进去之后在SQL编辑框中发送的SQL指令也许就是通过这个字符集编码的,如果跟数据库一致的话,当然没有问题了。


附上一个简单的sql测试代码:

#drop database test_001;
create database test_001 default character set utf8 collate utf8_general_ci;
use test_001;

create table config (
  id                   smallint       not null default '1' ,     
  name                 varchar(64)    not null ,                 
  descr                varchar(64)    ,                 
  primary key(id) 
);
先建表,然后insert。
use test_001;
insert into config (id, name, descr )  values ( '1', '中文名字', '描述' );

当 mysql命令不使用 --default-character-set 参数,出现
ERROR 1406 (22001): Data too long for column 'name' at row 1
的错误
如果使用mysql命令时加上--default-character-set=gbk 的参数,则错误排除!

 

上面测试是在windowsXP中文版,mysql 5.0.27-community-nt
status出来的信息是:
mysql  Ver 14.12 Distrib 5.0.27, for Win32 (ia32)
Connection id:          19
Current database:       test_001
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.0.27-community-nt
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 7 hours 41 min 27 sec

 

评论

相关推荐

    ERROR 1406 : Data too long for column 解决办法

    在MySQL数据库操作中,当你尝试插入或更新一行数据时,如果某个字段的值超过了该字段定义的最大长度,系统会抛出“ERROR 1406 : Data too long for column”的错误。这个错误提示非常直接,意味着你试图输入的数据在...

    MySql写入中文错误解决

    在 MySQL 中,当我们尝试导入中文字符时,总是报错“Data too long for column XX at row n”。这个问题的主要原因是 MySQL 的默认编码为 gb2312,而我们通常使用的 UTF-8 编码,这两个编码之间的差异导致了这个问题...

    mysql5.0乱码的解决实例

    在MySQL 5.0中,乱码问题是一个常见的困扰,...同时,对于“data too long for column”的问题,需要根据实际情况调整字段长度或类型,以满足数据存储需求。在实践中,对字符集的理解和正确使用是预防此类问题的基石。

    大牛总结 MySql常见错误集锦

    10. 错误1406: Data too long for column 'column_name' at row 1 插入的数据长度超过了列的最大允许长度。调整数据的大小,或者增大列的长度限制。 这些错误只是MySQL使用过程中可能遇到的一部分,理解和解决这些...

    Mysql中文乱码问题完美解决方案.docx

    - `com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column` 错误表示数据长度超过了列的允许长度,这通常不是字符集问题,而是字段长度不足。需检查对应列的定义并调整其大小。 7. **...

    mysql乱码问题解决方案

    **问题1:** 当插入数据时出现“Data truncation: Data too long for column”错误。 **解决方法:** - 检查字段长度是否足够。 - 考虑增加字段的长度或者调整数据以适应现有的字段长度。 **问题2:** 应用程序抛...

    如何解决MYSQL数据中文乱码问题.docx

    如果字段长度足够,但插入中文字符时仍然收到“Data too long for column”错误,那可能是因为字段的字符集不支持中文字符。确保字段的字符集与数据库的字符集兼容。 7. **查询结果的字符集**: 除了数据库和字段...

    MySQL text插入长文本时报错Incorrect string value xE5x8FxAC.pdf

    在本例中,报错信息为“Incorrect string value :'\xE5\x8F\xAC' for column 'XXX' at row 1”,这通常意味着尝试插入的文本包含了MySQL无法识别的字符编码,或者字段类型不能容纳特定的字符序列。 首先,我们需要...

    mySQL 乱码问题解决方案

    在处理MySQL数据库时,中文乱码问题是一个常见的挑战,尤其对于使用GBK编码的系统迁移到UTF-8编码的场景。本文将深入探讨如何彻底解决MySQL中的中文乱码问题,涵盖从数据库、表、字段到连接参数等全方位的调整策略。...

    MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程

    但是,由于返回的结果是字符串,当子集数量庞大时,可能会导致`Data too long for column`的错误,因为它受到列的最大长度限制。 ```sql CREATE FUNCTION `lvtao_demo_a`(rootId int) RETURNS text CHARSET utf8 ...

    PHP+MYSQL 出现乱码的解决方法

    如果遇到`Data too long for column`错误,检查字段类型和长度。 2. **数据库创建时指定字符集**:在创建数据库时明确指定字符集,如`CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_general_ci;` 3. **...

    探究MySQL中varchar的定义长度

    在上面的例子中,当尝试向`VARCHAR(10)`列插入`12345678901`时,由于超过了10个字节(10个英文数字字符共10字节),MySQL返回了`ERROR 1406 (22001): Data too long for column 'name' at row 1`错误。同样,当尝试...

    Delphi7.1 Update

    * When the size of a Persistent field in TClientDataSet is set too large, it overwrites neighboring fields upon Post (Quality Central 3974). * TDataSetProvider generates incorrect SQL in response to ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 oracle的体系很庞大,要学习它,首先要了解oracle的框架。oracle的框架主要由物理结构、逻辑结构、内存分配、后台进程...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    $foo = 5 + "10 Little Piggies"; // $foo是一个整数(15) $foo = 5 + "10 Small Pigs"; // $foo是一个整数(15) 如果想要强行转换变量类型,可以使用与C语言相同的函数settype()。 2.5 变量与常量 可能你已经注意...

Global site tag (gtag.js) - Google Analytics