`
- 浏览:
89318 次
- 性别:
- 来自:
北京
-
mysql5.1 中文 乱码 mysql 5.1 中文字符集问题终极解决方案
今天安装了一个mysql 5.1.40,刷刷刷几下安装完成后,建立一个数据库、一个表,然后,向表中插入数据,数据中包含中文,结果死活插入不了,总是报错: Incorrect string value: '\xD0\xD0\xD0\xC7\xB3\xDD...' for column 'kind_nm' at row 1。
然后上网查找解决方案,最后设置服务器端、数据库、数据表甚至表中的一列的字符集皆为utf8,并且在插入之前加上了SET NAMES 'utf8',结果还是无法插入,依然报刚才那个错误。
搞了一个多小时,最后一高人指出问题之根本原因:在安装数据库时,未选择字符集gbk(或者gbk2312)。 我晕死!我在安装时选择的是utf8。于是卸载mysql,重新安装,选择gbk2312,结果什么也不设置,直接插入中文,已下载就成功了!
不过网上众多人素偶说的一般解决也是有用的,下面是我总结整理的设置字符集的方法:
1:MYSQL的字符集支持
MySQL的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。
对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
2:MYSQL的默认字符集
MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集。
但是,传统的 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么
,默认的配置从何而来呢?
(1)编译MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置
文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个
数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用UTF-8 存储。
3:查看MYSQL的字符集(默认情况下,mysql的字符集是latin1(ISO_8859_1)
通常,查看系统的字符集和排序方式的设定可以通过下面的两条命令:
命令1:mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+---------------------- -----------+
| Variable_name | Value |
+--------------------------+---------------------- -----------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | D:"mysql-5.0.37"share"charsets" |
+--------------------------+---------------------- -----------+
命令2:mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
4:修改默认字符集
(1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值,如
default-character-set = utf8
character_set_server = utf8
修改完后,重启mysql的服务,使用 mysql> SHOW VARIABLES LIKE 'character%';查看,发现数据库编码均已改成utf8:
+--------------------------+---------------------- -----------+
| Variable_name | Value |
+--------------------------+---------------------- -----------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:"mysql-5.0.37"share"charsets" |
+--------------------------+---------------------- -----------+
(2) 还有一种修改字符集的方法,就是使用mysql的命令
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;
一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码
。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句: SET NAMES 'utf8';
它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
5:总结
(1) 正确的设定数据库编码:MySQL4.0以下版本的字符集总是默认ISO8859-1,MySQL4.1在安装的时候会
让你选择。如果你准备使用UTF- 8,那么在创建数据库的时候就要指定好UTF-8(不过mysql 5 却不能在安装的时候选择编码utf8,我今天刚试过,结果死活插入不了中文!)
(2)要保证character_set_client,character_set_connection这两个变量与character_set_database一致;同时保证character_set_results与SELECT返回的结果以及程序的编码一致,这一点相当重要!至于设置的办法,见上文"4:修改默认字符集"。
(3)在插入数据之前,最好加上一句:SET NAMES 'utf8',这一句话等同于:
set character_set_client = 'utf8'
set character_set_connection = 'utf8'
set character_set_results = 'utf8'
当然,如果整个环境所设置的字符集都为gbk,则此处也要这样设置:SET NAMES 'gbk'。
(4)对重点的再一次总结:
要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;
要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;
要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;
要保证程序编码与浏览器编码一致,即程序编码与<meta http-equiv="Content-Type" content="text/html; charset=?"/>一致。
6:补充
如果以上的方法还不行的话,建议下载一个视图工具navicate for mysql,通过该视图工具直接向数据库中插入数据。不过,mysql 5 总是无法设置字符集为utf8,因此,建议还是使用mysql 4 吧。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
mysql 总结........................................................................................................................................6 1.1 数据库的种类.......................................
709行左右将AddDefaultCharset ISO-8859-1修改为AddDefaultCharset gb2312,即增加默认的字符集为简体中文。 若不修改上面两行,则显示的文字是乱码?修改后并不会立刻改过来,好象重启系统或计算机后才好。 (3)...
实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...
实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...
每个实例都是经过笔者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。 本书两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;本书实例来源...
6) 修改MYSQL支持库跨静态编译的EXE和DLL传递连接句柄和记录集句柄无效的BUG(改动较大,可能会产生兼容性问题,我们已经仔细测试,也请使用到此库的用户帮助我们多多测试,以便及早发现问题,谢谢) 7) 其它修改 ...
3.4.2 解决中文乱码 3.4.3 获取客户端数据 3.5 response回应对象的应用 3.5.1 HTTP头信息的操作 3.5.2 设置MIME类型 3.5 13页面重定向操作 3.6 Session会话对象的应用 3.6.1 session的生命周期 3.6.2 会话的创建与...
全书一共被压缩为5个rar,这是第二个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
全书一共被压缩为5个rar,这是第五个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
全书一共被压缩为5个rar,这是第四个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
全书一共被压缩为5个rar,这是第三个!...21.2 中文乱码问题的解决方案 614 21.3 使用过滤器解决中文问题 616 21.4 让tomcat支持中文文件名 620 21.5 国际化与本地化 621 21.5.1 locale 621.. 21.5.2 资源包 623 ...
{5.1}时间与日期}{94}{section.5.1} {5.1.1}各类时间日期转换}{94}{subsection.5.1.1} {5.1.2}时间的输入与输出}{97}{subsection.5.1.2} {5.2}数字的输入输出}{97}{section.5.2} {5.2.1}将浮点数四舍五入到指定...