`

mysql中文乱码latin1转utf8

 
阅读更多

一、MySQL字符集设置

系统变量:

character_set_server:默认的内部操作字符集

character_set_client:客户端来源数据使用的字符集

character_set_connection:连接层字符集

character_set_results:查询结果字符集

character_set_database:当前选中数据库的默认字符集

character_set_system:系统元数据(字段名等)字符集

还有以collation_开头的同上面对应的变量,用来描述字符序。

introducer指定文本字符串的字符集:

格式为:[_charset] ‘string’ [COLLATE collation]

例如:

• SELECT _latin1 ‘string’;

• SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;

introducer修饰的文本字符串在请求过程中不经过多余的转码,直接转换为内部字符集处理。

二、MySQL中的字符集转换过程

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection

2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

使用每个数据字段的CHARACTER SET设定值;

若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准)

若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;

若上述值不存在,则使用character_set_server设定值。

3. 将操作结果从内部操作字符集转换为character_set_results

 

三、latin1转换到utf8

以原来的字符集为latin1为例,升级成为utf8的字符集。原来的表: databasename (default charset=latin1),新表:new_databasename(default charset=utf8)

 

  1. mysql> show create database databasename;
  2. +--------------+-------------------------------------------------------------------------+
  3. | Database| Create Database|
  4. +--------------+-------------------------------------------------------------------------+
  5. | databasename | CREATE DATABASE `databasename` /*!40100 DEFAULT CHARACTER SET latin1 */ |
  6. +--------------+-------------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)

 

 

1> 导出表结构:

 

  1. mysqldump -uroot -p --default-character-set=utf8 -d databasename > createtab.sql

 

 

其中--default-character-set=utf8 表示设置以什么字符集连接, -d 表示只导出表结构,不导出数据。

2>修改 createtab.sql中表结构定义中的字符集为新的字符集。

 

  1. sed -i s/CHARSET=latin1/CHARSET=utf8/g `grep -rl "CHARSET=latin1" createtab.sql `

 

 

3>确保记录不再更新,导出所有记录。

 

  1. mysqldump -uroot -p --no-create-info databasename > data.sql

 

 

可选参数:

--quick: 该选项用于转储大的表。 它强制 mysqldump 从服务器一次一行地检索表中的行而不是 检索所有行,并在输出前将它缓存到内存中。

--extended-insert: 使用包括几个 values 列表的多行insert语法,这样使转储文件更小,重载文件时可以加速插入。

--no-create-info: 不写重新创建每个转储表的create table 语句。

--default-character-set=latin1: 按照原有的字符集导出所有数据,这样导出的文件中,所有中文都是可见的,不会保存成乱码。不添加该参数以默认字符导出。

4>打开data.sql,将 set names latin1 修改成 set names utf8

 

  1. sed -i s/CHARSET=latin1/CHARSET=utf8/g `grep -rl "CHARSET=latin1" data.sql `

 

 

 

(PSsed工作效率是非常高的,在测试中60G的数据4分钟就转换完毕了

 

5>使用新的字符集创建新的数据库。

 

  1. create database new_databasename default charset utf8;

 

 

6>创建表,执行 createtab.sql

 

  1. mysql -uroot -p new_databasename < createtab.sql

 

 

7>导入数据,执行data.sql

 

  1. mysql -uroot -p new_databasename < data.sql

8、查看新数据库的字符信息

 



  1. mysql> show create database new_databasename;
  2. +------------------+-----------------------------------------------------------------------------+
  3. | Database| Create Database|
  4. +------------------+-----------------------------------------------------------------------------+
  5. | new_databasename | CREATE DATABASE `new_databasename` /*!40100 DEFAULT CHARACTER SET utf8 */ |
  6. +------------------+-----------------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> show createtable type;
  9. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  10. | Table | Create Table|
  11. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  12. | type | CREATE TABLE `type` (
  13. `id` int(10) NOT NULL AUTO_INCREMENT,
  14. `Name` varchar(100) CHARACTER SET gb2312 NOT NULL,
  15. PRIMARY KEY (`id`)
  16. ) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 |
  17. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  18. 1 row in set (0.00 sec)

 

注意:选择字符集的时候,要注意最好是源字符的超级,或者确定比源字符集的字库更大

 

MySQL会出现中文乱码的原因不外乎下列几点:
1.server本身设定问题,例如还停留在latin1
2.table的语系设定问题(包含character与collation)
3.客户端程式(例如php)的连线语系设定问题
强烈建议使用utf8!!!!
utf8可以兼容世界上所有字符!!!!
一、避免创建数据库及表出现中文乱码和查看编码方法
1、创建数据库的时候:CREATE DATABASE `test`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';
2、建表的时候 CREATE TABLE `database_user` (
`ID` varchar(40) NOT NULL default '',
`UserID` varchar(40) NOT NULL default '',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这3个设置好了,基本就不会出问题了,即建库和建表时都使用相同的编码格式。
但是如果你已经建了库和表可以通过以下方式进行查询。
1.查看默认的编码格式:
mysql> show variables like "%char%";
+--------------------------+---------------+
| Variable_name | Value |
+--------------------------+---------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+-------------+
注:以前2个来确定,可以使用set names utf8,set names gbk设置默认的编码格式;

执行SET NAMES utf8的效果等同于同时设定如下:
SET character_set_client='utf8';
SET character_set_connection='utf8';
SET character_set_results='utf8';

2.查看test数据库的编码格式:
mysql> show create database test;
+------------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+------------+------------------------------------------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET gbk */ |
+------------+------------------------------------------------------------------------------------------------+

3.查看yjdb数据库的编码格式:
mysql> show create table yjdb;
| yjdb | CREATE TABLE `yjdb` (
`sn` int(5) NOT NULL AUTO_INCREMENT,
`type` varchar(10) NOT NULL,
`brc` varchar(6) NOT NULL,
`teller` int(6) NOT NULL,
`telname` varchar(10) NOT NULL,
`date` int(10) NOT NULL,
`count` int(6) NOT NULL,
`back` int(10) NOT NULL,
PRIMARY KEY (`sn`),
UNIQUE KEY `sn` (`sn`),
UNIQUE KEY `sn_2` (`sn`)
) ENGINE=MyISAM AUTO_INCREMENT=1826 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC |

二、避免导入数据有中文乱码的问题
1:将数据编码格式保存为utf-8
设置默认编码为utf8:
set names utf8;
设置数据库db_name默认为utf8:
ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
设置表tb_name默认编码为utf8:
ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
导入:
LOAD DATA LOCAL INFILE 'C:\\utf8.txt' INTO TABLE yjdb;
2:将数据编码格式保存为ansi(即GBK或GB2312)
设置默认编码为gbk:
set names gbk;
设置数据库db_name默认编码为gbk:
ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
设置表tb_name默认编码为gbk:
ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
导入:
LOAD DATA LOCAL INFILE 'C:\\gbk.txt' INTO TABLE yjdb;

注:1.UTF8不要导入gbk,gbk不要导入UTF8;
2.dos下不支持UTF8的显示;
三、解决网页中乱码的问题
 
将网站编码设为 utf-8,这样可以兼容世界上所有字符。
  如果网站已经运作了好久,已有很多旧数据,不能再更改简体中文的设定,那么建议将页面的编码设为 GBK, GBK与GB2312的区别就在于:GBK能比GB2312显示更多的字符,要显示简体码的繁体字,就只能用GBK。
1.编辑/etc/my.cnf ,在[mysql]段加入default_character_set=utf8;
2.在编写Connection URL时,加上?useUnicode=true&characterEncoding=utf-8参;
3.在网页代码中加上一个"set names utf8"或者"set names gbk"的指令,告诉MySQL连线内容都要使用
utf8或者gbk;

分享到:
评论

相关推荐

    解决连接mysql中文显示乱码

    解决MySQL连接时中文显示乱码的问题,关键在于确保数据库、连接参数以及应用程序内部各环节的字符集设置保持一致,并采用适合中文字符的编码方式,如UTF-8。通过上述步骤,可以有效避免中文乱码现象,保证数据的正确...

    解决C#操作Mysql时中文乱码问题(真的解决了)

    总的来说,解决C#操作MySQL中文乱码问题的关键在于保持从数据库配置到代码再到文件的整个过程中的编码一致性,使用UTF-8编码,并确保在每个环节都正确地指定和处理。通过以上步骤,你应该能够成功地避免中文乱码问题...

    MYSQL使用UTF8中文乱码处理方法.docx

    MYSQL 使用 UTF8 中文乱码处理方法 MYSQL 使用 UTF8 中文乱码处理方法是指在使用 MYSQL 数据库时,如何正确地处理中文乱码问题。这个问题主要涉及到四个环节:前端网页、字符传输、连接 MYSQL 和 MYSQL 的存贮方式...

    mysql中文乱码问题

    默认情况下,character_set_server 变量的值是 latin1,這导致了中文乱码问题的出现。另外,数据库的编码方式也可能是导致乱码问题的原因。如果数据库的编码方式不是 utf8, 那么在插入中文数据时就会出现乱码问题。...

    Java写入MySQL中文乱码解决方法.docx

    MySQL 的默认编码方式是 latin1,需要将其设置为 utf8,以便正确地存储中文字符。 可以使用以下 SQL 语句查看 MySQL 的当前编码方式: ``` mysql&gt; show variables like 'character%'; ``` 输出结果如下: ``` +----...

    mysql中文乱码的解决方法

    1. **Server本身的设定问题**:比如仍然使用的是`latin1`字符集而非更广泛的`utf8`或`utf8mb4`。 2. **表的语系设定问题**:包括`character set`与`collation`设定不匹配,尤其是在创建表时未明确指定字符集的情况下...

    Mysql中文乱码问题完美解决方案

    - **问题描述**:如果MySQL服务端的默认字符集设置为`latin1`等非Unicode编码,则在存储或检索包含中文数据的记录时可能会出现乱码现象。 - **解决方案**: - 修改`my.cnf`或`my.ini`配置文件中的`[mysqld]`部分,...

    Mysql插入中文乱码问题解决

    通常,MySQL 的默认字符集是 Latin1(ISO 8859-1),这是一种西文字符集,并不支持中文字符。当尝试存储中文数据时,由于字符集不匹配,就会导致乱码现象。 此外,需要注意的是 UTF-8 是一种国际通用的编码格式,它...

    java中MySQL中文乱码问题解决方案

    这些命令将显示当前数据库的编码方式,通常默认的是 latin1 编码方式,但是 latin1 不支持中文编码,所以我们需要将其改为 utf8 编码方式。我们可以使用以下命令来修改编码方式: ``` SET NAMES "UTF8"; ``` 这将...

    MySQL乱码解决方案数据库乱码

    1. **服务器端字符集设置不当**:MySQL服务器默认字符集可能与实际使用的字符集不符,例如,默认为`latin1`而实际需要的是`gbk`或`utf8`。 2. **客户端连接字符集设置错误**:客户端(如PHP应用)连接到MySQL时没有...

    Mysql数据库中文乱码

    1. **服务器端设置**:如前所述,默认情况下MySQL服务器使用`latin1`字符集,该字符集不支持中文。 2. **客户端设置**:客户端与服务器之间的通信也可能因为字符集设置不同而导致乱码。 3. **数据导入导出**:在导入...

    MySQL写入中文乱码character

    - 如果`character_set_server`默认为`latin1`,并且需要永久更改为`utf8`,则需要在MySQL的安装配置阶段进行设置。具体步骤是在MySQL的安装配置工具`MySQLInstanceConfig.exe`中选择`Character Set`环节,并将...

    好东西 mySQL数据库latin1-gbk,gbk-utf8,gbk-big5

    MySQL数据库在处理字符编码时,经常涉及到不同的字符集转换,如latin1到gbk,gbk到utf8,甚至gbk到big5等。这些转换在处理多语言数据或者迁移数据库时尤其重要,因为不同的字符集支持不同的字符范围,比如latin1主要...

    mysql 数据库乱码处理

    MySQL 数据库乱码处理 MySQL 数据库字符乱码问题是数据库管理中常见的问题之一。造成乱码的原因多种多样,可能是由于数据库字符集的不正确设置、数据导入时的编码错误等。下面我们将详细讨论 MySQL 数据库乱码处理...

    MySql数据库导入乱码

    中文网站使用的字符集编码一般是 gb2312、gbk、utf8 等三种,而 PHPmyadmin 的默认字符集是 latin1_swedish_ci,这与我们使用的字符集不同,因此会出现中文乱码的问题。 解决这个问题的关键是正确设置字符集。在...

    MYSQL中文乱码 xx

    在处理MySQL数据库时,遇到中文乱码的问题是相当常见的,特别是在多语言环境下。根据所提供的文件信息,我们可以深入探讨几个关键的知识点,包括字符集(Character Set)与校对规则(Collation),以及如何在MySQL中...

    mysql 数据库乱码问题解决

    MySQL的默认字符集为`latin1`,而许多现代应用程序倾向于使用`utf8`或更现代的`utf8mb4`来支持更广泛的字符集,尤其是对于中文等多语言环境。解决Linux下的MySQL乱码问题主要涉及以下几个步骤: 1. **查看当前字符...

    nodejs和C语言插入mysql数据库乱码问题的解决方法.docx

    - **Node.js**:在连接MySQL时,确保指定`charset`参数为'utf8mb4',因为'utf8'在MySQL中实际上只支持基本的UTF-8字符集,而'utf8mb4'支持完整的Unicode范围,包括表情符号。例如,使用`mysql2`库时,创建连接的...

    mysql出现中文乱码解决

    1. 数据库的字符集设置不正确:MySQL数据库的默认字符集可能不支持中文,例如使用了如latin1这样的西欧字符集,而不适合中文的存储。 2. 表的字符集设置不匹配:即使数据库字符集是正确的,如果表的字符集设置不当...

Global site tag (gtag.js) - Google Analytics