刚开始工作的时候,在工作中遇到的与数据库相关的问题,多半跟编码有关,总结一下数据库编码的设置。

字符集

查看数据库支持的字符集:

mysql> SHOW CHARACTER SET;



从图中可以看到数据库中可用的字符集以及每个字符集的描述和默认的校对。

校对:在一个字符集中对字符的比对规则。

查看所支持的校对的完整列表。

mysql> SHOW COLLATIONS;

从中可以看到,有的字符集不止一种校对,例如latin1对不同的欧洲语言有几种校对,而且许多校对出现两次,一次区分大小写(由_cs表示case sensitive),一次不区分大小写(由_ci表示case insensitive)。

通常系统管理在安装时定义一个默认的字符集和校对。此外,也可以在创建数据库时,指定默认的字符集和校对。为了确定所使用的字符集和校对,可以使用一下语句:

mysql> SHOW VARIABLES LIKE 'character%';
mysql> SHOW VARIABLES LIKE 'collation%';

实际上,字符集很少是服务器范围(甚至是数据库范围)的设置,不同的表,甚至不同的列都可能需要不同的字符集,而且两者都可以在创建表时指定。

为了给表指定字符集和校对,可使用带子句的CREATE TABLE:

CREATE TABLE user(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
username VARCHAR(10)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

除了能指定字符集和校对的表范围内,MySQL还允许对没个列设置它们,如下所示:

CREATE TABLE user (
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
username VARCHA(10),
about VARCHAR(100) CHARACTER SET latin2 COLLATE latin2_general_ci
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

校对对用ORDER BY检索出来的数据排序时起非常重要的作用。如果需要用与创建表时不同的顺序排序特定的SELECT语句,可以在SELECT语句自身中进行:

SELECT * FROM customers ORDER BY lastname COLLATE latin1_general_cs;

编码设置

MySQL连接存在四种编码设置:

  1. 数据库服务端编码
  2. 数据库编码
  3. 客户端编码
  4. 连接编码

以上四个编码有一个不符合都有可能出现与预期不符合的结果。

查看编码情况:

mysql> status;

从上图中可以看到四个编码中数据库服务端编码和数据库编码都是latin1的编码,只有客户端和连接是使用的utf8,这也是默认的情况,MySQL安装之后若不做设置默认就是latin1编码,若有中文时定会造成很多困扰。下面就分步讲讲如何设置这几部分的编码。

  1. 设置数据库服务端编码:

    主要涉及到配置文件的修改,即/etc/mysql/my.conf,也可以通过SET命令的方式修改。

    /etc/mysql/my.conf中找到[mysqld](若没有则手动添加,同理,若/etc/mysql/my.conf不存在,手动添加即可)加入以下配置信息:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

此处设置好保存之后记得重启MySQL,若是Debian系的,如Ubuntu:

icebug@localhost:~$ sudo /etc/init.d/mysql restart

若是RedHat系的如CentOS:

icebug@localhost:~$ sudo /etc/init.d/mysqld restart

icebug@localhost:~$ sudo systemctl restart mysqld

重新登陆MySQL使用status查看,若都为utf8即说明设置成功。

当然,这还只是设置了默认编码,即对于新建的库编码是没有问题的,对于已经建立的库怎么办?这就需要单独设置数据库的编码了。

ALTER DATABASE <database name> CHARACTER SET <character set>;

EX:

mysql> ALTER DATABASE world CHARACTER SET utf8;
mysql> ALTER DATABASE world COLLATE utf8_general_ci;

从设置MySQL字符集这个过程中又加深了对一个道理的理解,不管学习哪个新东西,官方文档都应该作为首要资料翻阅,这才是真正可靠的捷径。: )

官方文档传送门:http://dev.mysql.com/doc/refman/5.7/en/charset.html

MySQL基础 - 编码设置的更多相关文章

  1. mysql utf8编码设置

    1.建立数据库时指定数据库db_test为utf8编码.: create database db_test character set utf8;  修改数据库db_test编码的命令为: alter ...

  2. MySQL修改编码设置及乱码问题

    源地址:http://blog.csdn.net/millia/article/details/5806774   昨天尝试把自己用php编写的第一个糙站发布到网上..结果出现了因为编码不统一而导致乱 ...

  3. mysql字符编码设置

    1.显示当前编码信息 mysql>show variables like '%character%' +--------------------------+------------------ ...

  4. mysql数据库编码设置成utf-8,避免出现乱码

    设置默认编码为utf8:set names utf8;设置数据库db_name默认为utf8:ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 C ...

  5. mysql 字符编码设置

    安装mysql时如果字符编码为默认值latin1,则需要修改为utf8以便支持中文数据. 命令如下: 1.显示数据库字符集 mysql> show create database test;+- ...

  6. java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 异常处理,及MySQL数据库编码设置

    java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,C ...

  7. 以Windows服务方式启动MySQL,并将其默认编码设置为UTF-8

    系统环境:Windows XP Professional 版本 2002 Service Pack 3 // 第1步:创建选项文件.首先下载mysql-5.5.12-win32.zip,只需复制mys ...

  8. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) - 转载

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  9. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

随机推荐

  1. Android直方图递增View

    继上次分析实现Android自定义View之扇形图之后,自己又画了下面的这个递增直方图,本来是想做个静态的直方图就完了,结果想想静态的没啥趣味,于是就加了递增 1 从分析最终效果 界面上要展现的东西有 ...

  2. C# 3个线程A B C 依次打印123123123..

    C#经典面试题: 有3个线程,A线程打印1,B线程打印2,C线程打印3,请用程序实现依次打印123123123... class Program { static void Main(string[] ...

  3. SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压

    很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...

  4. PHP错误日志控制(display_errors和error_reporting)

    display_errors和error_reporting是php程序调试过程中两个非常重要的参数,下面就来介绍一下这两个错误日志的配置如何开启和关闭: 我们知道在产品的生产环境肯定是不能够显示错误 ...

  5. Effective Java 13 Minimize the accessibility of classes and members

    Information hiding is important for many reasons, most of which stem from the fact that it decouples ...

  6. PL/SQL之--包

    一.包 包是一组相关过程.函数.常量.变量.游标.异常等PL/SQL程序设计元素的组合.它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法.通过使用包,可以使开发 ...

  7. HTML5 datalist 标签

    以前需要用JS写一个自动完成组件(Suggest),很费劲.HTML5时代则不用了,直接使用datalist标签,直接减少了工作量.如下 <!DOCTYPE html> <html& ...

  8. 常用的Linux可插拔认证模块(PAM)应用举例(一)

    pam_access.so模块 pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN).IP地址和用户实现全面的访问控制.pam_access.so模块的具体工作行为 ...

  9. 基于Retrotfit2.1+Material Design+ijkplayer开发的一个APP(新闻,gif 动图,视频播放)

    此项目主要目的还是为了练习框架的使用,仅供学习用途. 数据来源 新闻 直接用的聚合数据提供的接口:https://www.juhe.cn/docs/api/id/235gif动图 通过jsoup爬的某 ...

  10. Java语言中的基本词汇

    1.标识符包.类.方法.参数和变量的名称.大小写字母.数字._和$符号的组合,不以数字开始,不能使关键字,不能包括分隔符和换行.(严格区分大小写,最大长度255个字符) 2.字面量  某种类型的值(具 ...