您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

MySQL字符集常见问题的解决方法

2024/4/7 1:31:42发布16次查看
在google中搜索“mysql 乱码”,可以查到“1,550,000”条结果;搜索“jsp 乱码”,可以查到“1,450,000”条结果,当然jsp乱码不一定就是mysql乱码,但多数情况是编码问题(可能是页面编码、数据库编码)。可见,编码问题在我们开发过程中是经常出现的,因此
在google中搜索“mysql 乱码”,可以查到“1,550,000”条结果;搜索“jsp 乱码”,可以查到“1,450,000”条结果,当然jsp乱码不一定就是mysql乱码,但多数情况是编码问题(可能是页面编码、数据库编码)。可见,编码问题在我们开发过程中是经常出现的,因此对编码的了解、设置和修改就显得及其重要了。
1. mysql字符集和校对规则 我们都知道,字符集就是一套文字符号及其编码、比较规则的集合,因为计算机只认识二进制代码,所有我们必须要有一个转换。
mysql的字符集包括字符集(character set)和校对规则(collation)两个概念。字符集是用来定义mysql存储字符串的方式,而校对规则则定义了比较字符串的方式。
字符集和校对规则是一对多的关系,每个字符集至少对应一个校对规则,称为默认校对规则。
查看所有字符集的命令:show character set;
或是查看information_schema.character_sets,可以得到所有的字符集和它的默认的校对规则,它的表结构:desc information_schema.character_sets;
查看字符集的校对规则:show collation like 'gbk%';
校对规则命名约定:以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元,即比较是基于字符编码的值而与语言无关)结束。
实验命令:
select case when 'a' collate utf8_general_ci = 'a' collate utf8_general_ci then 'yes' else 'no' end;(yes)select case when 'a' collate gbk_chinese_ci = 'a' collate gbk_chinese_ci then 'yes' else 'no' end;(yes)select case when 'a' collate gbk_bin = 'a' collate gbk_bin then 'yes' else 'no' end;(no)
2. 设置字符集 mysql的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级。
服务器级:
[mysqld]default-character-set=utf8[mysql]default-character-set=utf8
或是启动时加上参数:mysqld --default-character-set=utf8
或是编译时加上参数:./configure --width-charset=utf8
查看字符集和校对规则:
show variables like 'character_set_server';show variables like 'collation_server';
数据库级:
查看字符集和校对规则:
show variables like 'character_set_database';show variables like 'collation_database';
表级:
查看字符集和校对规则:
show create table t \g
3. 简单修改字符集 简单修改只对以后的数据有影响,如果数据库中没有数据或是不想修改以前的数据,可以使用简单修改。
简单修改命令:
alter database character set utf8;alter table t character set utf8;
个人推荐在创建数据库时明确指定字符集和校对规则,避免受到默认值的影响。
创建数据库时指定:reate database databasename default charset gbk;
创建数据表时指定:
create table tablename(....) engind=innodb default charset=utf8 collate=utf8_bin;
4. 完全修改字符集 当数据库中已有数据,想修改数据集,不能通过简单的修改字符集完成,需要先将原数据导出,经过适当调整后重新导入才可完成。通过七步完成字符集的完全修改(假设原字符集是latin1,想修改成gbk)。
导出表结构:mysqldump -uroot -p --default-character-set=gbk -d databasename>createdb.sql --default-character-set=gbk 表示设置以什么字符集连接; -d 表示只导出表结构,不导出数据。 手工修改createdb.sql中表结构定义中的字符集(latin1)为新的字符集(gbk); 确保数据库中的数据不再更新,导出所有的数据:mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename>data.sql --quick 该选项用于转储大的表,它强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行,并在输出前将它缓存到内存中; --extended-insert 使用包括几个values的多行insert语法; --no-create-info 不要create table语句; --default-character-set=latin1 表示按照原有的字符集导出所有的数据。 打开data.sql,将set names latin1修改成set names gbk; 使用新的字符集创建数据库:create database databasename default charset gbk; 创建表:mysql -uroot -p databasename 导入数据:mysql -uroot -p databasename 最后 建议服务器的字符集参数不要修改,而是是创建数据库进加上字符集,特别是在创建表时记得加上,这样做的目的是为了使修改的影响最小化。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product