mysql字符乱码
admin
2023-06-05 00:01:34
0

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

模拟乱码现象:
mysql> create database kitty;
Query OK, 1 row affected (0.00 sec)
mysql> show create database kitty\G;
*************************** 1. row ***************************
       Database: kitty
Create Database: CREATE DATABASE `kitty` /*!40100 DEFAULT CHARACTER SET utf8 */
1 row in set (0.00 sec)
ERROR: 
No query specified
mysql> alter database kitty character set latin1;
Query OK, 1 row affected (0.01 sec)
mysql> flush privileges;
mysql> use kitty;
Database changed
创建teacher表(字符集为latin1):
CREATE TABLE `teacher` (
  `id` int(4) NOT NULL,
  `name` char(20) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `dept` varchar(16) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
插入两条数据,其中一行带有中文字符
mysql> insert into teacher values(1,'wanlong','31','Server'),(2,'laomao','31','售后部');
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 se
查看发现有乱码出现:
mysql> select * from teacher;
+----+---------+-----+--------+
| id | name    | age | dept   |
+----+---------+-----+--------+
|  1 | wanlong |  31 | Server |
|  2 | laomao  |  31 | ???    |
+----+---------+-----+--------+
2 rows in set (0.00 sec)

2) 如何解决乱码了

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

客户端:

set names utf8(临时生效)

修改my.cnf(永久生效)

[client]

default-character-set=utf8


服务端-库-表-程序

服务端:
[mysqld]
default-character-set=utf8(适合5.1及以前的版本)
character-set-server=utf8(适合5.5)
库:
查看数据库的编码:
mysql> show variables like'%char%';
+--------------------------+-------------------------------------------+
| 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       | /application/mysql-5.5.32/share/charsets/ |
+--------------------------+-------------------------------------------+
8 rows in set (0.00 sec)
表:
查看表的编码:
mysql> show create table teacher\G;
*************************** 1. row ***************************
       Table: teacher
Create Table: CREATE TABLE `teacher` (
  `id` int(4) NOT NULL,
  `name` char(20) CHARACTER SET latin1 NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `dept` varchar(16) CHARACTER SET latin1 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: 
No query specified
mysql> select * from teacher;
+----+---------+-----+--------+
| id | name    | age | dept   |
+----+---------+-----+--------+
|  1 | wanlong |  31 | Server |
|  2 | laomao  |  31 | ???    |
|  3 | kobe    |  35 | ???    |
+----+---------+-----+--------+
3 rows in set (0.00 sec)
mysql> show create table teacher\G;
*************************** 1. row ***************************
       Table: teacher
Create Table: CREATE TABLE `teacher` (
  `id` int(4) NOT NULL,
  `name` char(20) CHARACTER SET latin1 NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `dept` varchar(16) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: 
No query specified
修改字段的字符集:
mysql> alter table `teacher` change `dept` `dept` varchar(16) CHARACTER SET utf8 NOT NULL;
mysql> alter table `teacher` change `name` `name` char(20) CHARACTER SET utf8 NOT NULL;
mysql> show full columns from teacher;
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+--
| Field | Type        | Collation       | Null | Key | Default | Extra | Privileges                      | C
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+--
| id    | int(4)      | NULL            | NO   |     | NULL    |       | select,insert,update,references |  
| name  | char(20)    | utf8_general_ci | NO   |     | NULL    |       | select,insert,update,references |  
| age   | tinyint(2)  | NULL            | NO   |     | 0       |       | select,insert,update,references |  
| dept  | varchar(16) | utf8_general_ci | NO   |     | NULL    |       | select,insert,update,references |  
+-------+-------------+-----------------+------+-----+---------+-------+---------------------------------+--
4 rows in set (0.00 sec)
mysql> select * from teacher;
+----+---------+-----+--------+
| id | name    | age | dept   |
+----+---------+-----+--------+
|  1 | wanlong |  31 | Server |
|  2 | laomao  |  31 | ???    |
|  3 | kobe    |  35 | ???    |
+----+---------+-----+--------+
3 rows in set (0.00 sec)
测试再次插入带有中文字符的字段:
mysql> insert into teacher values(4,'万龙',30,'校园网'),(5,'知行',29,'华东院');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from teacher;
+----+---------+-----+-----------+
| id | name    | age | dept      |
+----+---------+-----+-----------+
|  1 | wanlong |  31 | Server    |
|  2 | laomao  |  31 | ???       |
|  3 | kobe    |  35 | ???       |
|  4 | 万龙    |  30 | 校园网    |
|  5 | 知行    |  29 | 华东院    |
+----+---------+-----+-----------+
5 rows in set (0.00 sec)


3)老数据仍旧是乱码!

说明:

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


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

修改数据库默认编码:

“alter database kitty character set *”


4)参考解决方法:

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

1、导出表结构
mysqldump -uroot -predhat12345 -S /data/3306/mysql.sock --default-character-set=latin1 -d kitty>kittytable.sql
说明:-d只导表结构
2、编辑kittytable.sql,将lantin1改成utf8
可以用sed批量修改
3、确保数据库不再更新,导出所有数据
mysqldump -uroot -predhat12345 -S /data/3306/mysql.sock --quick --no-create-info --extended-insert --default-character-set=latin1 kitty>kittydata.sql
4、打开kittydata.sql,将set names latin1修改成set names utf8
5、删除原有的库表及数据(需要慎重)
6、建库
create database kitty default charset utf8;
7、创建表,执行kittytable.sql
mysql -uroot -predhat12345 -S /data/3306/mysql.sock kitty


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

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

mysql> system cat test.sql
set names utf8;
insert into teacher values (6,'张飞',45,'商务部');

b、通过source来调用sql文件

mysql> source test.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 1 row affected (0.01 sec)
mysql> select * from teacher;
+----+---------+-----+-----------+
| id | name    | age | dept      |
+----+---------+-----+-----------+
|  1 | wanlong |  31 | Server    |
|  2 | laomao  |  31 | ???       |
|  3 | kobe    |  35 | ???       |
|  4 | 万龙    |  30 | 校园网    |
|  5 | 知行    |  29 | 华东院    |
|  6 | 张飞    |  45 | 商务部    |
+----+---------+-----+-----------+
6 rows in set (0.00 sec)






相关内容

热门资讯

美国打压进口多晶硅,中使馆回应 【环球时报报道 记者 倪浩 尹野平】当地时间8月6日,美国总统特朗普签署行政令,依据《1962年贸易...
历史性一天,给美国的一个强烈信... 对中东来说,这是历史性的一天。沙特王储萨勒曼、土耳其总统埃尔多安、巴基斯坦总理夏巴兹,8月7日在沙特...
美参议院法案拟对中印加税100... 据美国消费者新闻与商业频道(CNBC)8月7日报道,美国参议院周五以压倒性优势通过了一项对俄罗斯制裁...
华为×Les Néréides... IT之家 8 月 7 日消息,华为终端 BG CEO 何刚今日宣布,FreeClip 2 耳夹耳机配...
2026年正规的手机取卡针品控... 现在手机数码行业更新迭代速度越来越快,终端品牌对供应链配套的要求也越来越高,一个小小的手机取卡针,虽...
预计“白海豚”明晚将在浙江舟山... 今天6时中央气象台发布台风橙色预警和强对流天气蓝色预警。台风橙色预警今年第13号台风“白海豚”(强台...
谷歌AI业务重组幕后:商业化压... 财联社8月7日讯(编辑 史正丞)本周早些时候, 美国互联网巨头谷歌宣布对旗下AI业务展开全面洗牌。D...
喜报!古田一小斩获全国青少年无... 近日,第十届全国青少年无人机大赛总决赛在天津收官。古田县第一小学慈育雏鹰基地无人机社团6名学子,在基...
加媒:加拿大正与美国商讨,以贸... 据加拿大《环球邮报》8月7日消息,知情人士称,加拿大和美国正在讨论一项潜在协议。根据该协议,渥太华将...
德意电器油烟机怎么样,口碑好吗 最佳回答 你好,得意的抽油烟机虽然不怎么做广告,但是人家很牛啊,不做广告,我的价格依然很高,关键是,...