mysql 改变数据库编码

本文介绍了解决在MySQL中插入中文数据时出现“datatoolongforcolumn”错误的方法。主要涉及调整命令行编码设置及数据库编码配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 方法很简单有两种:1用set names 'gb2312'指定编码 2在my.ini中用#注释 sql-mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION或把其中的 STRICT_TRANS_TABLES, 去掉,然后重启 mysql 就ok了 这样就不会有data too long for column的提示,

 方法很简单有两种:1用set names 'gb2312'指定编码
                            2在my.ini中用#注释
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"或把其中的
STRICT_TRANS_TABLES,
去掉,然后重启mysql就ok了
 
这样就不会有data too long for column的提示,不过它会自动把内容截取插入数据库中.
 
 
今天在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:           [email=root@localhost]root@localhost[/email]
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
<think>好的,我需要帮助用户在MySQL中修改数据库的字符集和编码设置。首先,我要回顾用户提供的引用内容,确保信息准确。引用[1]、[2]、[3]、[4]都提到了不同的方法,比如使用ALTER DATABASE、修改表和列的字符集,以及设置全局量。 用户的问题是如何更改字符集和编码,所以需要分步骤说明。首先,可能需要先检查当前的字符集设置,这可以通过SHOW CREATE DATABASE命令来完成,如引用[4]提到的查看方法。然后,修改数据库级别的字符集,使用ALTER DATABASE语句,这在引用[3]和[1]中都有提到。例如,ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci。 接下来,用户可能需要修改现有表和列的字符集。引用[2]详细说明了需要分别修改表结构和列,使用ALTER TABLE语句,并可能需要转换现有数据。例如,ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。同时,注意连接设置,如character_set_client和character_set_results,引用[4]中的全局量设置可能也需要调整,以确保应用程序和数据库之间的正确交互。 此外,还需要考虑utf8mb4的优势,如支持更多字符(比如Emoji),这也是引用[2]提到的重点。因此,在步骤中应该推荐使用utf8mb4而不是旧的utf8。 可能还需要注意,修改数据库字符集不会自动影响现有表和列,必须显式修改,否则它们会保留原来的设置。这点在引用[2]中有说明,所以要提醒用户逐一修改表和列。另外,如果数据库中有存储过程或触发器,可能也需要检查它们的字符集。 最后,生成相关问题时要覆盖用户可能进一步关心的内容,比如如何验证修改是否成功、处理数据迁移中的乱码问题、不同字符集的影响等。同时确保所有步骤中的代码示例正确,使用正确的语法,比如使用正确的ALTER语句和CONVERT TO选项。</think>### 如何在 MySQL 中更改数据库字符集和编码设置 #### **步骤 1:查看当前字符集设置** 在修改前,建议先查看数据库的当前字符集和排序规则: ```sql SHOW CREATE DATABASE 数据库名; ``` 例如: ```sql SHOW CREATE DATDBASE mydb; ``` 输出结果中的 `DEFAULT CHARACTER SET` 和 `DEFAULT COLLATE` 即为当前设置[^4]。 --- #### **步骤 2:修改数据库字符集** 通过 `ALTER DATABASE` 命令修改数据库的默认字符集和排序规则: ```sql ALTER DATABASE 数据库名 CHARACTER SET 目标字符集 COLLATE 目标排序规则; ``` 例如,将数据库 `mydb` 修改为 `utf8mb4` 字符集和 `utf8mb4_unicode_ci` 排序规则: ```sql ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 此操作仅影响新创建的表,已有表需单独修改[^3][^2]。 --- #### **步骤 3:修改表的字符集** 修改数据库中所有表的字符集(需逐表执行): ```sql ALTER TABLE 表名 CONVERT TO CHARACTER SET 目标字符集 COLLATE 目标排序规则; ``` 例如: ```sql ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 此命令会将表中所有列的字符集一并修改,并重新编码现有数据[^2]。 --- #### **步骤 4:调整连接设置** 确保客户端、连接和结果集的编码一致,避免乱码: ```sql SET character_set_client = utf8mb4; SET character_set_connection = utf8mb4; SET character_set_results = utf8mb4; ``` 可通过修改 MySQL 配置文件 `my.cnf` 永久生效: ```ini [client] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci ``` 修改后需重启 MySQL 服务[^4]。 --- #### **注意事项** 1. **utf8mb4 vs utf8** `utf8mb4` 支持完整的 Unicode 字符(如 Emoji),而 MySQL 的 `utf8` 仅支持 3 字节字符。推荐优先使用 `utf8mb4`。 2. **数据兼容性** 修改字符集可能导致数据转换错误,建议先备份数据。 3. **索引重建** 字符集修改后,需检查索引是否正常,必要时重建索引。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值