09 MySQL字符集

字符集的选择

1.数据库方面最流行的是UTF-8

2.如果只考虑支持汉字,那么使用GBK,毕竟GBK下,每个汉字只占用2个字节,而UTF-8需要3个字节.

3.如果需要做大量的字符运算,如比较/排序等,选择 定长字符集 比较好.

4.如果所有客户端程序都支持相同的字符集,优先选择该字符集.避免因字符集转换带来的性能开销以及数据损失.

MySQL支持的字符集简介:

MySQL服务器可以支持多种字符集.同一台服务器,同一个数据库,甚至同一个表中的不同字段都可以指定不同的字符集.(Oracle同一个数据库只能使用相同的字符集)

查看所有可用的字符集:

SHOW CHARACTER SET ;

或者查看information_schema.character_sets表

DESC information_schema.character_sets ;

查看字符集所对应的校对规则(一对多关系)

SHOW COLLATION LIKE ‘***‘ ; -- 如LIKE ‘gbk%‘

校对规则的命名约定 :

字符集名[_语言名]_后缀

后缀包括: ci(大小写不敏感) , cs(大小写敏感) , bin(基于二进制比较,和语言本身无关).

例如: gbk_chinese_ci , gbk_bin ...

SELECT

CASE WHEN ‘A‘  COLLATE gbk_chinese_ci = ‘a‘

THEN

1

ELSE

0

END ;

--结果返回 1

MySQL 字符集设置:

字符集和校对规则有4个级别的默认设置:服务器级,数据库级,表级,字段级(列级).

a.服务器字符集和校对,在MySQL服务启动的时候确定.

1).在my.cnf中设置

[mysqld]

default-character-set=gbk

2).在启动选项中指定

mysqld --default-character-set= gbk

3).在编译的时候指定 todo how?

./configure --with-charset=gbk

如果没有指定服务器的字符集,则默认使用latin1作为服务器的字符集.

以上三种方式都只指定了字符集,并未指定校对规则.

查询当前服务器的字符集和校对规则:

SHOW VARIABLES LIKE ‘character_set_server‘; --查看服务器字符集

SHOW VARIABLES LIKE ‘collation_server‘ ;   --查看服务器字符集对应的校对规则

b.数据库级字符集和校对规则

可以在创建数据库的时候指定,也可以通过ALTER DATABASE 语句进行修改.

但是采用ALTER TABLE 方式时 : 如果该数据库中已经有数据, 更改字符集并不会对已经存在的数据进行转换,需要使用其他方法.

指定了字符集和校对规则,则使用它们;

指定了字符集,没有指定校对规则,使用默认校对规则;

没有指定字符集和校对规则,使用服务器级别的字符集和校对规则.

推荐在创建数据库的时候明确指定字符集和校对规则,避免收到默认值的影响.

查看当前数据库的字符集和校对规则:

SHOW VARIABLES LIKE ‘charcater_set_database‘ ;

SHOW VARIABLES LIKE ‘collation_database‘ ;

c.表级字符集和校对规则

推荐在创建表的时候明确指定字符集和校对规则.

CREATE TABLE t (

id BIGINT(10) NOT NULL AUTO_INCREAMENT

, PRIMARY KEY(id)

) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_bin ;

使用SHOW CREATE TABLE tbl_name 语句查看.

d.列的字符集和校对规则

这种遇到的几率很小.

连接字符集和校对规则: 指客户端与服务器的连接

MySQL 提供了3个参数,分别是character_set_client , character_set_connection以及character_set_results

一般来讲这三个需要保持一致,才可以保证用户写入的数据能被正确的读出.

因此,不会单独设置这三个参数,而是一起设置,通过以下命令.

SET NAMES *** ; --这种方式,需要应用每次连接数据库都要执行.

更简单的方式,在my.cnf中设置

[mysqld]

default-character-set=xxx

这样所有连接默认的字符集都是xxx,不需要执行SET NAMES了.

字符集的修改步骤

针对,想同时更改已有数据的字符集的情况.

1).导出表结构

mysqldump -uroot -p --default-character-set=old_charset -d database_name [ tbl_name ]> xxx.sql

其中, -d 表示只导出表结构,不导出数据

如果导出某个数据库中的所有表 , 省略 tbl_name ; 反之,指定要导出数据的表名tbl_name.

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

3).确保记录不再更新的情况下,导出所有记录

mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=old_charset  database_name [ tbl_name ] > data.sql

其中 --quick :                            用于转储大的表.它强制mysqldump从服务器一次一行的检错表中的行,而不是一次性全部检索,并在输出前缓存到内存中.

--no-create-info:                        不写重新创建每个转储表的CREATE TABLE 语句.

--default-character-set= old_charset : 按照原有的字符集导出所有数据,不会乱码.

—extended-insert : 这样插入语句 会是多条insert语句,性能好,mysql默认是这种.

4).打开data.sql , 将SET NAMES old_charset 修改成 SET NAMES new_charset ;

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

CREATE DATABASE new_database_name default charset new_charset ;

6).创建表,执行xxx.sql

mysql -uroot -p new_database_name < xxx.sql ;

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

mysql -uroot -p new_database_name < data.sql ;

原文地址:https://www.cnblogs.com/lmxxlm-123/p/11131962.html

时间: 2024-10-25 00:15:34

09 MySQL字符集的相关文章

mysql字符集小结

author:skate time:2013/04/09 mysql字符集小结 今天同事阿杰兄发现内部一台mysql测试服务器乱码,以前也记录过关于字符集的,今天再补充下 修改mysql的字符集和默认存储引擎 http://blog.csdn.net/wyzxg/article/details/7581415 查看库现有的字符集: mysql> show variables like '%char%'; +--------------------------+------------------

第09章 mysql 字符集

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] Mysql字符集设置 [6] 修改及查看mysql数据库的字符集 [7] MyS

MySQL字符集

一. 选择合适的字符集 二. MySQL支持的字符集 MySQL服务器可以支持多种字符集,在同一台服务器.同一个数据库甚至同一个表的不同字段都可以指定使用不同的字符集. 查看所有可用的字符集命令是show character set; 或者查看information_schema.character_set,可以显示所有的字符集和该字符集默认的校对规则.desc information_schema.character_sets; MySQL的字符集包括字符集(CHARACTER)和校对规则(C

MySQL 字符集

查看mysql 字符集设置情况: show variables like '%char%' +--------------------------+----------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------+ | character_set_client | gbk | | chara

关于MySQL字符集问题【已解决】

关于MySQL字符集问题[已解决] 先来看看我的字符集设置 全都是utf8.这里没有什么问题 接下来我创建了一个数据表book.来看下我创建的表结构 当输入命令:mysql> insert into book(bookname,publisher,author,price,detail) values('PHP','电子工业出版社','武胜利','80.00','与PHP相关的图书');ERROR 1366 (HY000): Incorrect string value: '\xB5\xE7\x

mysql字符集调整总结

mysql字符集调整总结 --http://xjsunjie.blog.51cto.com/999372/1355013 字符集是一套符号和编码的规则,不论是在oracle数据库还是在mysql数据库,都存在字符集的选择问题.对于数据库来说,字符集又是比较重要的,因为数据库存储的数据大部分都是各种文字,字符集对于数据库的存储.处理性能以及数据迁移都有重要的影响. 如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以我们建议

MySQL字符集编码

MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并参考了凯哥的文章,总结了这篇博文.本文主要是对mysql常见的字符集问题进行整理,如有错误,请大家指正. 1.MySQL字符集编码简介 谈到字符集,总会跟编码扯上关系,有关字符集和编码的理论知识请参见我之前的文章.MySQL内部是支持多种字符集的,这里就不再严格区分字符集和编码的概念了.同时,MySQL中

docker mysql 文件挂载和MySQL字符集设置

docker run -p 3306:3306 --name mysql -v /usr/local/mysql/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/logs:/logs -v /usr/local/mysql/data:/mysql_data -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6 -p 3306:3306:将容器的3306端口映射到主机的3306端口 -v $PWD/conf/my.cnf:/et

MySQL字符集的设置

Notice:文章基于ubuntu系统而写 1.关于MySQL字符集 MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). MySQL对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection). MySQL对于字符集的指定可以细化到一个数据库,一张表,一列,应该用什么字符集. 2.查看MySQL字符集 2.1.查看字符集