`
bighuamao
  • 浏览: 14325 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

MySQL中文乱码

阅读更多

 

Issue: MySQL数据库存储的中文为乱码

Env:    Deiban + MySQL 5.1.47


1、MySQL字符集


  查看当前MySQL服务器支持的所有字符集

mysql> SHOW CHARACTER SET;
 

 

  任何一个给定的字符集至少有一个校对规则。它可能有几个校对规则。


  列出一个字符集的校对规则

mysql> SHOW COLLATION LIKE 'ucs2%';
mysql> SHOW COLLATION LIKE 'utf8%';
 

   校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci (大小写不敏感)、_cs (大小写敏感)或_bin (二元)结束。


  查看当前字符集设置

mysql> show variables like 'character_set_%';
mysql> show variables like 'collation_%';
 


  修改数据库的字符集

mysql>use dbname
mysql>alter database dbname character set utf8 collate utf8_general_ci;
 

  创建数据库指定数据库的字符集

mysql>create database dbname character set utf8;
 

 

或者通过配置文件修改

修改/var/lib/mysql/dbname/db.opt

default-character-set=latin1
default-collation=latin1_swedish_ci

default-character-set=utf8
default-collation=utf8_general_ci

然后重起MySQL。


  修改MySQL的表的字符集

mysql> alter table table_name default character set utf8 collate utf8_general_ci;
 

  服务器使用character_set_client 变量作为客户端发送的查询中使用的字符集。

 

  服务器接收到查询后应该转换为哪种字符集?

服务器使用character_set_connection collation_connection 系统变量。它将客户端发送的查询从character_set_client 系统变量转换到character_set_connection (除 非字符串文字具有象_latin1_utf8 的引介词)。

 

  服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?

character_set_results 变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果 元数据(如列名)。

 

  字符集转换流程

client(如servlet)发送一个查询 -> 服务器收到查询,将查询串从character_set_client 转换到character_set_connection,然后执行转换后的查询 -> 服务器将结果数据转换到character_set_results字符集后发送回客户端。

 

  调整这些变量的设置

有两个语句影响连接字符集:

 

SET NAMES 'charset_name'

SET CHARACTER SET charset_name


SET NAMES 显示客户端发送的SQL 语句中使用什么字符集。因此,SET NAMES 'cp1251' 语句告诉服务器“将来从这个客户端传来的信息采用字符集 cp1251 。 它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一个SELECT 语句 它 表示列值使用了什么字符集。)

SET NAMES 'x ' 语句与这三个语句等价:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x; 

x 设置为character_set_connection 也就设置了collation_connectionx 的默认校对规则。


SET CHARACTER SET 语句是类似的,但是为 默认数据库设置连接字符集和校对规则。SET CHARACTER SET x 语句与这三个语句等价:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET collation_connection = @@collation_database;
 

当一个客户端连接时,它向服务器发送希望使用的字符集名称。服务器为那个字符集设置character_set_clientcharacter_set_resultscharacter_set_connection 变量。(实际上,服务器为使用该字符集执行一个SET NAMES 操作。)

对于mysql 客户端,如果你希望使用与默认字符集不同的字符集,不需要每次 启动时执行SET NAMES 语句。可以在mysql 语句行中或者选项文件中添加一个--default-character-set 选 项设置。例如,你每次运行mysql 时,以下的选项文件设置把三个字符集变量修改为koi8r:

 

[mysql]

default-character-set=koi8r

 

例如:假设column1 定义为CHAR(5) CHARACTER SET latin2 。如果没有设定SET NAMESSET CHARACTER SET SELECT column1 FROM t ,当连接后,服务器使用客户端指定的字符集返回列column1 的所有值。 另一方面,如果你设定SET NAMES 'latin1'SET CHARACTER SET latin1 ,那么发送结果之前,服务器转换latin2 值到latin1 。 转换可能会丢失那些不属于两种字符集的字符。 ,那么对于

如果不希望服务器执行任何转换,设置character_set_resultsNULL

mysql> SET character_set_results = NULL;

 

  使用JDBC连结MySQL时,可以在URL中指定字符集

jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK

 

URL在xml配置文件中的写法:

jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK

&  & 的转义字符。

 

 

2、解决方法

 

(1) 修改/etc/mysql/my.cnf,加入:

[mysqld]

default-character-set   = gbk
init_connect            = 'SET NAMES gbk'


[client]
default-character-set   = gbk

 

(2)在JDBC连结串中指定字符集为GBK

jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=GBK









分享到:
评论

相关推荐

    mysql中文乱码问题

    MySQL 中文乱码问题解决方法 MySQL 是一个功能强大且广泛应用的关系型数据库管理系统,但是,在使用 MySQL 时,用户经常会遇到中文乱码问题。今天,我们将讨论在 MySQL 中的中文乱码问题,并提供解决方法。 MySQL...

    解决连接mysql中文显示乱码

    以下是对如何解决连接MySQL时中文显示乱码问题的详细解析。 ### 解决中文显示乱码的关键知识点 #### 1. **理解字符集和编码** 字符集(Character Set)是指用于表示文字的一系列符号集合,而编码(Encoding)则是将...

    java插入mysql中文乱码解决

    ### Java插入MySQL中文乱码解决 #### 一、问题背景 在使用Java应用程序与MySQL数据库交互的过程中,常常会遇到一个令人头疼的问题:中文字符在存储到数据库时出现乱码现象。这种现象通常发生在使用JDBC(Java ...

    Delphi2010解决ZEOSDBO-7.1.3a控件调用mysql中文乱码

    Delphi2010解决ZEOSDBO-7.1.3a控件调用mysql中文乱码 ZConnection1.Database:=_Database1; ZConnection1.Port:=_Port; ZConnection1.User:=_User; ZConnection1.Password:=_Password; ZConnection1.HostName:=_...

    PHP+MySql中文乱码解决方案

    6. **PHP连接MySQL时指定的编码不正确**:在PHP脚本中连接MySQL时,如果没有正确指定编码,也会引起乱码问题。 #### 三、解决方案 针对以上提到的乱码原因,我们可以通过以下步骤来逐一解决: ##### 1. PHP网页的...

    jsp+mysql中文乱码解决方案集合

    ### jsp+mysql中文乱码解决方案集合 在使用JSP结合MySQL进行Web应用开发时,中文乱码问题一直是困扰开发者的一大难题。本文将详细介绍如何在MySQL数据库层面解决中文乱码问题,并提供一系列实用的方法和技巧。 ###...

    MySQL中文乱码问题解决方案

    ### MySQL中文乱码问题解决方案 在使用MySQL的过程中,中文乱码问题是常见的问题之一,尤其是在数据库初始设置不当时,更容易出现此类问题。本文将详细介绍如何彻底解决MySQL中的中文乱码问题。 #### 一、理解中文...

    PHP+MySql中文乱码解决办法

    ### PHP+MySQL中文乱码解决办法详解 #### 一、乱码产生的原因 在使用PHP+MySQL进行开发的过程中,中文乱码问题是常见的一个问题。乱码现象通常发生在从数据库查询中文数据时,显示出来的中文变成了不可识别的符号...

    Mysql 中文乱码 最简单的解决办法

    总结,解决MySQL中文乱码问题的关键在于确保服务器、数据库、表及字段的字符集设置一致,并与数据源保持匹配。在开发和维护过程中,关注字符集的统一性,可以避免很多不必要的编码问题。通过上述步骤,你应该能够...

    mysql汉字乱码问题

    5. **客户端配置**:确保连接MySQL的客户端工具(如MySQL Workbench, Navicat等)也使用正确的字符集。这通常在连接设置中进行。 6. **数据导入导出**:在导入或导出数据时,务必确保文件和数据库之间字符集的一致...

    C++操作MariaDB和MySql中文乱码或无法处理中文的解决办法

    C++操作MariaDB和MySql中文乱码或无法处理中文的解决办法 在使用C++操作MariaDB和MySQL数据库时,中文乱码或无法处理中文是一个常见的问题。本文将介绍如何解决这个问题,确保C++程序正确地处理中文。 解决方法 ...

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

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

    jsq+mybatis+mysql中文乱码解决方案

    JSQ+MyBatis+MySQL 中文乱码解决方案 中文乱码是 JSQ、MyBatis 和 MySQL 集成时常见的问题,解决这个问题需要从多方面入手。本文将从 JSP、MyBatis 和 MySQL 三个方面来解决中文乱码问题。 JSP 中文乱码解决方案 ...

    Mysql中文乱码问题解决方案

    本文将深入探讨MySQL中文乱码问题的原因、解决方法,以及如何在创建数据库和表时避免这类问题。 首先,我们要了解字符集的概念。字符集(Character Set)是计算机系统用来表示文本的一系列符号和编码,例如ASCII、...

    解决 docker mysql 中文乱码问题

    使用 docker 启动 mysql 容器可能会出现中文乱码的情况,这里记录如何制作支持中文的 mysql 镜像 docker版本:18.06 mysql 版本:5.7 1. 创建 my.cnf 文件 [client] default-character-set=utf8 [mysql] default-...

    mysql中文乱码的解决方法

    ### MySQL中文乱码的解决方法 #### 一、问题背景 在使用MySQL的过程中,经常会遇到中文乱码的问题,这不仅影响了数据的正确读取,也会导致用户体验下降。中文乱码的原因主要有以下几点: 1. **Server本身的设定...

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

    Java 中 MySQL 中文乱码问题解决方案 Java 中 MySQL 中文乱码问题是数据库开发中常见的问题之一,解决这个问题需要对数据库、JSP 和 Tomcat 进行相应的设置。下面我们将详细介绍解决该问题的方案。 数据库编码修改...

Global site tag (gtag.js) - Google Analytics