金沙棋牌app手机下载

当前位置:金沙棋牌 > 金沙棋牌app手机下载 > mysql中的字符集,开发基础系列14

mysql中的字符集,开发基础系列14

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-22 11:10

字符集是一套文字符号及其编码,比较规则的集合。第一个字符集是ascll(american standard code for information interchange)。

mysql字符集

mysql中的字符集

图片 1


概述

从本质上来讲,计算机只识别二进制代码,因此,不论计算机程序还是其处理的数据,最终都必须转化为二进制码,计算机才能识别。人们给每一个文字符号编码以便计算机识别处理,这就是计算机字符集的由来。

 1.  选择合适的字符集

 

选择合适的字符集

MySQL5.6支持几十种字符集,包括UCS-2、UTF-16、UTF-16LE、UTF-32、UTF-8、utf8mb4等Unicode字符集,选择字符集可以考虑如下几个因素:

满足应用支持语言需求,如果应用需要处理各式各样的文字,应该选择Unicode编码,对于MySQL,建议为UTF-8; 如果应用中涉及已有数据导入,要充分考虑数据库字符集对已有数据的兼容性。 如果数据库只需要支持一般中文,数据量大,性能要求较高,那可以选择双字节定长编码的中文字符集,比如GBK,因为相对于UTF-8,GBK比较小,每个汉字只占2个字节,utf-8汉字需要3个字节;相反,如果主要处理英文字符,选择UTF-8更好,因为GBK,UCS-2,UTF-16中的西文字符编码都是2个字节。 如果数据库需要做大量的字符运算,选择定长字符集更好一些。 如果所有的客户端程序都支持相同的字符集,则优先选择该字符集作为数据库的字符集。

常用字符集比较:
图片 2

  对于数据库来说,字符集很重要,因为数据库存储的数据大部分是各种文字,字符集对数据库的存储,处理性能,以及日后系统的移植,推广都有会影响
  如何选择呢?
    UTF-8: 如果应用要处理各种各样的文字,或将发布使用不同语言的国家或地区,就应该选择 Unicode字符集,对于mysql 目前就是UTF-8。如果主要处理英文字符,仅有少量汉字数据,那么选择utf-8更好。因为gbk,ucs-2,utf-16对西文字符编码都是2字节,会造成不必要的开销。
    GBK: 如果数据库只需要支持一般中文,数据量很大,性能要求也很高,那应该选择双字节定长编码的中文字符集GBK。相对于uft-8而言,gbk比较“小”,每个汉字只占2个字节,而utf-8汉字编码需要3个字节,这样可以减少磁盘I/0, 数据库缓存,以及网络传输的时间。
    如果数据库需要做大量的字符运算,如比较,排序等,选择定长的字符集可能更好,因为定长字符集比变长处理速度快。如gbk固定双字节,utf-32固定4字节。
    客户端程序使用的字符集, 在数据库端应优先选择该字符集,避免因字符集转换带来性能开销和数据损失。

字符集基础

MySQL字符集

MySQL支持在同一台服务器,同一个数据库,甚至同一个表的不同字段都可以使用不同的字符集。 MySQL字符集包括字符集和校对规则;其中字符集用来定义MySQL存储字符串的方式,校对规则用来定义字符串比较方式,字符集与校对规则是一对多的关系。 MySQL有4个级别的默认设置:服务器级,数据库级,表级,字段级。服务器级可以在MySQL配置文件(my.cnf)中设置character-set-server=utf-8;其他是创建时候设置。 对于实际应用中, 还存在客户端和服务器之间的字符集和校对规则设置。MySQL提供3个参数设置:character_set_client、character_set_connection、character_set_results分别代表客户端、连接、返回结果的字符集。通常不会单独设置这3个参数,可以通过命令:set names ***来设置,还可以设置my.cnf中的default-character-set=utf-8来设置。

MySQL字符集系统变量含义如下:

图片 3

概述 从本质上来讲,计算机只识别二进制代码,因此,不论计算机程序还是其处理的数据,最终都必须转化为二进制码,计...

2. mysql 字符集

字符集:数据库中的字符集包含两层含义

  mysql 支持几十种字符集。 如下图所示:

  1. 各种文字和符号的集合,包括各国家文字,标点符号,图形符号,数字等。
  2. 字符的编码方式,即二进制数据与字符的映射规则;
SHOW CHARACTER SET;

 

  图片 4

字符集分类:

3. mysql字符集的设置

  • ASCII:美国信息互换标准编码;英语和其他西欧语言;单字节编码,7位(bits)表示一个字符,共128字符。
  • GBK:汉字内码扩展规范;中日韩汉字、英文、数字;双字节编码;共收录了21003个汉字,GB2312的扩展。
  • utf-8:Unicode标准的可变长度字符编码;Unicode标准(统一码),业界统一标准,包含世界上数十种文字的系统;utf-8使用一至4个字节为每一个字符编码。
  • 其他常见字符集:utf-32,utf-16,big5(繁体字),latin1()

  有4个级别的默认设置:服务器级,数据库级,表级,字段级。

 

   3.1 在服务器级,对my.cnf设置,在启动mysql服务

mysql字符集:

  图片 5

查看字符集:

  3.2 数据库级

mysql> SHOW CHARACTER SET ;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
| cp850    | DOS West European           | cp850_general_ci    |      1 |
| hp8      | HP West European            | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian       | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European        | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                | swe7_swedish_ci     |      1 |

   如果数据库中已有记录,修改字符集对原有的记录并没有影响,只对新记录使用。

 

 -- 查看当前数据库字符集
SHOW VARIABLES LIKE 'character%';

新增字符集:

图片 6

在编译mysql时用--with-charset=gbk 来新增字符集

-- 修改数据库字符集 
ALTER DATABASE 数据库名 CHARACTER SET utf8;

图片 7.png)

  3.3 表级

 图片 8

   可以通过alter table来修改,如果表中已有记录,修改字符集对原有的记录并没有影响,只对新记录使用。

 

--  查看
SHOW CREATE TABLE t;

字符集与字符序(字符排序的规则)

图片 9

charset 和 collation

--  修改表的字符集
ALTER TABLE  表名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

 

         3.4 列级

字符集与字符序是一对多的关系,但一个字符集至少有一个字符序

                   这种控制一般机率比较小,只是给我们提供了一个灵活设置的手段。

 

4  字符集修改 

collation:字符序,字符的排序与比较规则,每个字符集都有对应的多套字符序。

  如果在应用开始阶段没有正确设置字符集,在运行一段时间后发现不能满足要求需要调整,这时不能通过alter database character set 或alter tablename character set
命令进行,因为这两个命令都不会更新已有记录的字符集,对于已有的记录的字符集调整,需要先将数据导出,经过适当的调整重新导入后才完成。
  需要使用mysqldump工具来做导出导入,这里就不在演示只标记下:

 

以下是将iatin1字符集的数据库修改成GBK字符集的数据库过程
4.1 导出表结构:
mysqldump -uroot -p --default-character-set=gbk -d databasename> createtab.sql
4.2导出数据
    mysqldump -uroot -p --quick --no-create-info --extended-insert
    --default-character-set=latin1 databasename> data.sql
4.3  打开data.sql 将set names iatin1 修改成set names gbk
4.4 使用新的字符集创建新的数据库
        create database databasename default charset gbk;
4.5创建表 ,执行createtab.sql
      mysql  -uroot  -p databasename < createtab.sql
4.6导入数据,执行data.sql
      mysql  -uroot  -p databasename < data.sql

不同的字符序决定了字符串在比较排序中的精度和性能不同。

 

 

查看字符序

mysql> SHOW COLLATION ;

 

mysql的字符序遵从命名惯例:

  • 以_ci(表示大小写不敏感)
  • 以_cs(表示大小写敏感)
  • 以_bin(表示用编码值进行比较)

 

字符集设置级别

charset 和 collation的设置级别:

服务器级>>数据库级>>表级>>列级

 

服务器级

系统变量(可动态设置):

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

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

 

设置:

  • 使用命令直接设置
  • 配置文件中设置:mysqld,

 

 

数据库级(数据库中存储数据的默认字符集)

create database db_name character set latin1 collate latin1_swedish_ci;

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

主要影响load data 等语句的默认字符集;create database的字符集如果不设置,默认使用character_set_server的字符集。

 

表级

mysql>create table tbl(...) default charset=utf-8 default collate=utf8_bin

 

数据存储字符集使用规则:

  • 使用列集的character set 设定值
  • 若列级字符集不存在,则使用对应表级的default character set 设定值;
  • 若表级字符集不存在,则使用数据库级的default character set 设定值
  • 若数据库字符集不存在,则使用服务器级character_set_server设定值

 

实践


 

查看字符集

show [global] variables like 'character%'

show [global] variables like 'collation%'

 

mysql> SHOW VARIABLES LIKE '%CHARACTER%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

 

修改字符集

 

修改服务器级字符集

set global character_set_server=utf8; (全局)

修改表级字符集

alter table tbl convert to character set XXX;(表)

mysql> alter table stu convert to character set utf8;

 

客户端连接与字符集

连接与字符集

-character_set_client:客户端来源数据使用的字符集(客户端程序发过来的SQL用什么来编码的)

-character_set_conection:连接层字符集(做中间层转换)

-character_set_results:查询结果字符集(返回给客户端程序用的字符集)

 

一般可以统一设置(推荐):

msyql>set  names utf8;

也可以统一叫做连接字符集;

 

 

在配置文件中:

default-character-set = utf8

 

客户端连接字符集

图片 10.png)

图片 11

 

常见乱码原因:

  • 数据存储字符集不能正确编码(不支持)client发来的数据:client(utf8)->storage(latin1)
  • 程序连接使用的字符集与通知mysql的character_set_client,character_set_conection,character_set_results 等不一致或不兼容。(告诉mysql:set names gbk ;程序连接使用的字符集一致)

 

 

1.甚至表本身utf8,而设置 set names gbk, 程序连接也使用 gbk;

此时向表中插入汉字,依然可以显示而并不乱码,因为虽然程序连接使用gbk编码,mysql内部会将gbk转换成utf8来显示;

 

2.表utf8,set names utf8,但是 程序连接使用 gbk,此时向表中插入汉字,是乱码的。

 

 

load data 出现乱码:

aiapple@ubuntu:~$ file test.t
test.t: UTF-8 Unicode text
aiapple@ubuntu:~$ cat test.t
你好

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                    |
| character_set_database   | gbk                   |
| character_set_filesystem | binary                   |
| character_set_results    | utf8                        |
| character_set_server     | utf8                        |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql>load data infile '/home/aiapple/test.t' into table t;

此时会出现乱码,即告知数据库的character_set_database   的字符集与程序使用的文件test.t 不一样;

更改set character_set_database   =   utf8 则能正常显示;

这里与 普通告知mysql字符集 set names xxx 区别开来,毕竟是导入表到一个数据库当中,应该使数据库的字符集与文件的字符集相同

 

 

客户端连接与字符集

使用建议:

  • 创建数据库/表时显示的指定字符集,不使用默认
  • 连接字符集与数据存储字符集设置一致,推荐使用utf8
  • 驱动程序连接时显示指定字符集(set names xxx)

 

客户端的设置:

图片 12.png)

 图片 13

 

 

三要素:

1.程序驱动或客户端的字符集(在客户端设置)

2.告知mysql的字符集(set names xxx)

 3.数据存储的字符集(表结构的字符集alter table tbl convert to character set xxx)

 

前两个必须一致才不会出现乱码,推荐三个都设置成一致

 

需求:在系统运行了一段时间,有了一定的数据,后发现字符集不能满足要求需要重新修改,又不想丢弃这段时间的数据。

alter database character set xxx 或者alter table  tablename character set xxx;这两条命令只对想创建的表或者记录生效

 

方法:先将数据导出,经过适当的调整重新导入才可完成。

以下模拟的是将latin1字符集的数据库修改成GBK字符集的数据库的过程

1)导出表结构

mysqldump -uroot -p --default-character-set=gbk -d WY_yun >createtab.sq

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

 

2)手动修改creatatab.sql中表结构定义中的字符集为新的字符集

 

3)确保记录不在更新,导出所有记录

mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 WY_yun > data.sql

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

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

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

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

 

4)修改数据的字符集为新字符集---打开data.sql,将set names latin1 修改成 set names gbk

 

5)使用新得字符集创建新的数据库

mysql> create database na default charset gbk;

 

6)将新字符集的表结构导入新库;创建表,执行createtab.sql

mysql -uroot -p na <createtab.sql

 

7) 将新字符集的数据文件导入新库;导入数据,执行data.sql

 mysql -uroot -p na < data.sql

似乎实验没有成功可以去提问?

总结

 


 

  • 字符集与字符序是1:N
  • 字符序是字符的排序与比较规则及字符的精度和性能;
  • 表级别字符集修改:alter table stu convert to character set utf8;
  • 三个连接相关字符集统一设置:set names utf8;
  • 常见乱码原因
  • load数据时,因让数据库级别的字符集与文件相同;
  • 三要素:
    •   程序驱动或客户端的字符集(在客户端设置)
    •   告知mysql的字符集(set names xxx)
    •   数据存储的字符集(表结构的字符集alter table tbl convert to character set xxx)
  • 运行一段时间后发现数据乱码,如何保存数据;

 

 

本文由金沙棋牌发布于金沙棋牌app手机下载,转载请注明出处:mysql中的字符集,开发基础系列14

关键词:

上一篇:字符串截取

下一篇:没有了