天天看点

mysql字符乱码

1)MySQL插入中文数据乱码问题:

<code>模拟乱码现象:</code>

<code>mysql&gt; create database kitty;</code>

<code>Query OK, 1 row affected (0.00 sec)</code>

<code>mysql&gt; show create database kitty\G;</code>

<code>*************************** 1. row ***************************</code>

<code>       </code><code>Database: kitty</code>

<code>Create Database: CREATE DATABASE `kitty` /*!40100 DEFAULT CHARACTER SET utf8 */</code>

<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>ERROR: </code>

<code>No query specified</code>

<code>mysql&gt; alter database kitty character </code><code>set</code> <code>latin1;</code>

<code>Query OK, 1 row affected (0.01 sec)</code>

<code>mysql&gt; flush privileges;</code>

<code>mysql&gt; use kitty;</code>

<code>Database changed</code>

<code>创建teacher表(字符集为latin1):</code>

<code>CREATE TABLE `teacher` (</code>

<code>  </code><code>`</code><code>id</code><code>` int(4) NOT NULL,</code>

<code>  </code><code>`name` char(20) NOT NULL,</code>

<code>  </code><code>`age` tinyint(2) NOT NULL DEFAULT </code><code>'0'</code><code>,</code>

<code>  </code><code>`dept` varchar(16) DEFAULT NULL</code>

<code>) ENGINE=InnoDB DEFAULT CHARSET=latin1</code>

<code>插入两条数据,其中一行带有中文字符</code>

<code>mysql&gt; insert into teacher values(1,</code><code>'wanlong'</code><code>,</code><code>'31'</code><code>,</code><code>'Server'</code><code>),(2,</code><code>'laomao'</code><code>,</code><code>'31'</code><code>,</code><code>'售后部'</code><code>);</code>

<code>Query OK, 2 rows affected, 1 warning (0.00 sec)</code>

<code>Records: 2  Duplicates: 0  Warnings: 1</code>

<code>mysql&gt; flush privileges;</code>

<code>Query OK, 0 rows affected (0.00 se</code>

<code>查看发现有乱码出现:</code>

<code>mysql&gt; </code><code>select</code> <code>* from teacher;</code>

<code>+----+---------+-----+--------+</code>

<code>| </code><code>id</code> <code>| name    | age | dept   |</code>

<code>|  1 | wanlong |  31 | Server |</code>

<code>|  2 | laomao  |  31 | ???    |</code>

<code>2 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

2) 如何解决乱码了

不乱码的思想:建议中英文混合的环境,选择utf-8

客户端:

set names utf8(临时生效)

修改my.cnf(永久生效)

[client]

default-character-set=utf8

服务端-库-表-程序

<code>服务端:</code>

<code>[mysqld]</code>

<code>default-character-</code><code>set</code><code>=utf8(适合5.1及以前的版本)</code>

<code>character-</code><code>set</code><code>-server=utf8(适合5.5)</code>

<code>库:</code>

<code>查看数据库的编码:</code>

<code>mysql&gt; show variables like</code><code>'%char%'</code><code>;</code>

<code>+--------------------------+-------------------------------------------+</code>

<code>| Variable_name            | Value                                     |</code>

<code>| character_set_client     | utf8                                      |</code>

<code>| character_set_connection | utf8                                      |</code>

<code>| character_set_database   | utf8                                      |</code>

<code>| character_set_filesystem | binary                                    |</code>

<code>| character_set_results    | utf8                                      |</code>

<code>| character_set_server     | utf8                                      |</code>

<code>| character_set_system     | utf8                                      |</code>

<code>| character_sets_dir       | </code><code>/application/mysql-5</code><code>.5.32</code><code>/share/charsets/</code> <code>|</code>

<code>8 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>表:</code>

<code>查看表的编码:</code>

<code>mysql&gt; show create table teacher\G;</code>

<code>       </code><code>Table: teacher</code>

<code>Create Table: CREATE TABLE `teacher` (</code>

<code>  </code><code>`name` char(20) CHARACTER SET latin1 NOT NULL,</code>

<code>  </code><code>`dept` varchar(16) CHARACTER SET latin1 DEFAULT NULL</code>

<code>) ENGINE=InnoDB DEFAULT CHARSET=utf8</code>

<code>|  3 | kobe    |  35 | ???    |</code>

<code>3 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>  </code><code>`dept` varchar(16) NOT NULL</code>

<code>修改字段的字符集:</code>

<code>mysql&gt; alter table `teacher` change `dept` `dept` varchar(16) CHARACTER SET utf8 NOT NULL;</code>

<code>mysql&gt; alter table `teacher` change `name` `name` char(20) CHARACTER SET utf8 NOT NULL;</code>

<code>mysql&gt; show full columns from teacher;</code>

<code>+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+--</code>

<code>| Field | Type        | Collation       | Null | Key | Default | Extra | Privileges                      | C</code>

<code>| </code><code>id</code>    <code>| int(4)      | NULL            | NO   |     | NULL    |       | </code><code>select</code><code>,insert,update,references |  </code>

<code>| name  | char(20)    | utf8_general_ci | NO   |     | NULL    |       | </code><code>select</code><code>,insert,update,references |  </code>

<code>| age   | tinyint(2)  | NULL            | NO   |     | 0       |       | </code><code>select</code><code>,insert,update,references |  </code>

<code>| dept  | varchar(16) | utf8_general_ci | NO   |     | NULL    |       | </code><code>select</code><code>,insert,update,references |  </code>

<code>4 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>测试再次插入带有中文字符的字段:</code>

<code>mysql&gt; insert into teacher values(4,</code><code>'万龙'</code><code>,30,</code><code>'校园网'</code><code>),(5,</code><code>'知行'</code><code>,29,</code><code>'华东院'</code><code>);</code>

<code>Query OK, 2 rows affected (0.01 sec)</code>

<code>Records: 2  Duplicates: 0  Warnings: 0</code>

<code>+----+---------+-----+-----------+</code>

<code>| </code><code>id</code> <code>| name    | age | dept      |</code>

<code>|  1 | wanlong |  31 | Server    |</code>

<code>|  2 | laomao  |  31 | ???       |</code>

<code>|  3 | kobe    |  35 | ???       |</code>

<code>|  4 | 万龙    |  30 | 校园网    |</code>

<code>|  5 | 知行    |  29 | 华东院    |</code>

<code>5 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

3)老数据仍旧是乱码!

说明:

a)对于已有数据库想修改字符集不能直接通过“alter database kitty character set *”或者“alter table tablename character set *”,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或记录生效。

b)已经有记录的字符的调整,必须先将数据导出,经过修改字符集后重新导入后才可完成

修改数据库默认编码:

“alter database kitty character set *”

4)参考解决方法:

如何更改生产MySQL数据库库表的字符集

<code>1、导出表结构</code>

<code>mysqldump -uroot -predhat12345 -S </code><code>/data/3306/mysql</code><code>.sock --default-character-</code><code>set</code><code>=latin1 -d kitty&gt;kittytable.sql</code>

<code>说明:-d只导表结构</code>

<code>2、编辑kittytable.sql,将lantin1改成utf8</code>

<code>可以用</code><code>sed</code><code>批量修改</code>

<code>3、确保数据库不再更新,导出所有数据</code>

<code>mysqldump -uroot -predhat12345 -S </code><code>/data/3306/mysql</code><code>.sock --quick --no-create-info --extended-insert --default-character-</code><code>set</code><code>=latin1 kitty&gt;kittydata.sql</code>

<code>4、打开kittydata.sql,将</code><code>set</code> <code>names latin1修改成</code><code>set</code> <code>names utf8</code>

<code>5、删除原有的库表及数据(需要慎重)</code>

<code>6、建库</code>

<code>create database kitty default charset utf8;</code>

<code>7、创建表,执行kittytable.sql</code>

<code>mysql -uroot -predhat12345 -S </code><code>/data/3306/mysql</code><code>.sock kitty&lt;kittytable.sql</code>

<code>8、导入数据</code>

<code>mysql -uroot -predhat12345 -S </code><code>/data/3306/mysql</code><code>.sock kitty&lt;kittydata.sql</code>

5)执行SQL文件插入中文数据不乱码实战:

a、将需要更新的sql语句放到文本文件中

<code>mysql&gt; system </code><code>cat</code> <code>test</code><code>.sql</code>

<code>set</code> <code>names utf8;</code>

<code>insert into teacher values (6,</code><code>'张飞'</code><code>,45,</code><code>'商务部'</code><code>);</code>

b、通过source来调用sql文件

<code>mysql&gt; </code><code>source</code> <code>test</code><code>.sql</code>

<code>Query OK, 0 rows affected (0.00 sec)</code>

<code>|  6 | 张飞    |  45 | 商务部    |</code>

<code>6 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code></code>

本文转自 冰冻vs西瓜 51CTO博客,原文链接:http://blog.51cto.com/molewan/1862982,如需转载请自行联系原作者