GB2312-80 定长 双字节 早期标准,不再推荐使用
GBK 定长 双字节 不是国标,但支持众多
GB 18030 不定长 2或4 数据库支持的少,不推荐
UTF-8*(推荐) 不定长 1-4 互联网、linux、Mysql广泛支持
字符集选择:
1,多国家多语言 UTF-8
2,数据库导入,先字符集要向下兼容
3,已中文为主,量大,有性能要求,推荐定长的 GBK
4,已英文为主,少量汉子,推荐 UTF-8,英文部分1字节,节省开销
5,数据库有大量字符运算,如比较、排序,推荐定长GBK。
6,选择多数系统支持的字符集,如 UTF-8
查看字符集校对规则:
show collation like 'gbk%'
_ci(ignore),大小写不敏感
_cs ,大小写敏感
_bin,二元,比较字符码编码值,与language无关。
4个级别设置:服务器级,数据库级,表级,字段级
服务器级:
1,my.ini [mysqld] character-set-server=gbk(default-character-set=utf8表示通信字符集)
2,启动时 mysqld --character-set-server=gbk
3,编译时指定 shell make . DDEFAULT_CHARCET=gbk
查看: show variables like 'character_set_server';
show variables like 'collation_server';
数据库级:
不能通过该方法,修改已有数据的数据库,可能导致乱码。
查看: show variables like 'character_set_database';
show variables like 'collation_database';
表级:查看:show create table
字段级:忽略。
链接字符集:
character_set_connection character_set_results,character_set_client
数据库字符集修改:
直接修改库字符集:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
表字符集批量修改(会锁表,所有非显示列跟着调整):
SELECT
T.table_name,
table_schema,
CCSA.character_set_name AS character_set_name, CCSA.collation_name AS collation_name,
concat( 'ALTER TABLE ', table_schema, '.', T.table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;' ) FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation
AND T.table_schema = 'pre_caidao_hrpaas'
AND (character_set_name != 'utf8mb4'
OR collation_name != 'utf8mb4_0900_ai_ci')
列字符集批量修改:
SELECT table_name,table_schema,COLUMN_NAME,COLUMN_TYPE,CHARACTER_SET_NAME ,collation_name,COLUMN_DEFAULT,COLUMN_COMMENT,
concat('ALTER TABLE ',table_schema,'.',table_name,' MODIFY ',COLUMN_NAME,' ',COLUMN_TYPE,IF(COLUMN_DEFAULT is Null, ' DEFAULT NULL ', concat(' DEFAULT "',COLUMN_DEFAULT,'"')) ,' COMMENT "',COLUMN_COMMENT ,'" ;') as temp
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'pre_caidao_hrpaas' and ( collation_name != 'utf8mb4_0900_ai_ci'
OR character_set_name != 'utf8') ;
1,导出表结构:
msqldump -uroot -p --default-character-set=gbk -d databasename > createtab.sql
default-character-set=gbk:连接字符集
-d:只导出表结构
2,手工修改createtab.sql的字符集为新字符集
3,确保数据不在更新,导出所有记录
mysqldump -uroot -p --quick -no-create-info --extended-insert --default-character-ser=latin1 databasename > data.sql
--quick:用于转存大表,强制mysqldump 从服务器一次一行地检索表中的行而不是所有行,并在输出前将它缓存到内存中。
--extended-insert:合并insert语句中的values值,新增数据加快。
--no-create-info:不导出create table语句。
--default-character-set=latin1 :按原有字符集导出,不乱码,所有中文可见。
4,打开data.sql,将set names latin1 修改成set names gbk
5,使用新字符集创建新数据库
create database databasename default charset gbk;
6,创建表,执行createtab.sql
mysql -uroot -p databasename < createtab.sql
7,导入数据,执行data.sql
mysql -uroot -p databasename < data.sql