mysql在linux下乱码问题

来源:互联网 发布:labview编程 编辑:程序博客网 时间:2024/06/08 00:17

一、操作

mysql默认字符集是latin1,但是我们大部分程序使用的字符集是utf8,我们就需要修改mysql的字符集了。

1、查看默认编码

showvariables 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 | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

Mysql下默认的编码是latin1


2查看默认排序方式

showvariables like 'collation_%';

+----------------------+-----------------+

|Variable_name        | Value          |

+----------------------+-----------------+

|collation_connection | latin1_swedish_ci |

|collation_database   | latin1_swedish_ci |

|collation_server     | latin1_swedish_ci |

+----------------------+-----------------+


3、通过show variables like 'character%', 我们看到有很多变量,但是那些是我们需要修改的或者说在从客户端请求到数据库服务返回数据都经过了那些步骤:

(1)、从请求到返回数据的流程:

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

   2)进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,步骤如下

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

  B.若上述值不存在,则使用对应数据表的字符集设定值

  C.若上述值不存在,则使用对应数据库的字符集设定值;

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

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


(2)、从请求到返回数据的整个流程图:



总结: 从上面的流程我们看到从请求到返回结果集进行了多次转化而如果某两个转化之间的编码不同的话都会出现乱码,所以在整个流程中涉及到的都要设置需要的编码而且要一致。


4、修改默认字符集

修改文件/etc/my.cnf内容

[client]下添加如下语句

default-character-set=utf8  

[mysqld]下添加

default-character-set=utf8

init_connect='SET NAMES utf8'    ##设定连接mysql是使用UTF8编码

修改好后,重启mysql服务即可


5、另外一种修改字符编码方法

登录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 ;


6、重新查看

showvariables like 'character%';

+--------------------------+---------------------------------+

|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       |/usr/share/mysql/charsets/|

+--------------------------+---------------------------------+

showvariables like 'collation_%';

+----------------------+-----------------+

|Variable_name        | Value          |

+----------------------+-----------------+

|collation_connection | utf8_general_ci |

|collation_database   | utf8_general_ci |

|collation_server     | utf8_general_ci |

+----------------------+-----------------+

6)使用JDBC连接mysql时需要将连接字符串改为如下方式:

jdbc:mysql://localhost/mysql?useUnicode=true&characterEncoding=UTF-8

utf8的方式连接


二、概念

character-set-server/default-character-set:服务器字符集,默认情况下所采用的。

character-set-database:数据库字符集。

character-set-table:数据库表字符集。

character-set-client:客户端的字符集。客户端默认字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。

character-set-results:结果字符集。服务器向客户端返回结果或者信息时,结果以该字符集进行编码。

统一设置字符集编码使用语句:set names utf8


三、导入导出防止乱码

1.导出数据库使用命令(在cmd下输入)

mysqldump -u用户名 -p密码 -h服务器地址数据库名称 --default-character-set=utf8 --hex-blob >导出数据库.sql

--default-character-set=utf8代表使用urf8编码导出数据

--hex-blob代表以16进制导出数据库

2.导入数据库使用命令(在cmd下输入)

mysql -u用户名 -p密码 -h服务器地址数据库名称 --default-character-set=utf8--hex-blob  <导出数据库.sql

除了使用上面的命令导入数据库外,还可以登录mysql,使用source命令导入

mysql> source导出数据库.sql

注意blob字段存放的是二进制数据,故其没有字符集编码,在windowlinux使用以上方式还是会有乱码的问题,故建议将blob类型修改为text类型,才不会出现乱码。blob类型数据往text类型转换,自己写一个简单的代码,从blob读出数据以字符串的形式存到text字段即可。

 


 

0 0
原创粉丝点击