认识MySQL中的数据对象和字符集
2023-09-16 本文已影响0人
古飞_数据
1.MySQL数据库中的对象
2.为什么说MySQL不建议生产环境使用存储过程,如果必须要用,要考虑什么?
3.理解MySQL字符集使用
4.数据库升级、迁移乱码怎么处理
1.MySQL数据库中的对象
image.png2.为什么说MySQL不建议生产环境使用存储过程,如果必须要用,要考虑什么?
缺点
MySQL没有执行计划缓存
MySQL每次SQL,存储过程都需要解析一下,导致CPU,成为瓶颈
MySQL每个SQL只能使用一个CPU,也可以说是一个连接只能使用一个CPU (Server层,目前InnoDB层可以使用到多核),导致CPU成为瓶颈
前端很容易扩容,MySQL扩容成本比较高
好处
可以适当的封装业务逻辑
减少前端和数据库交互次数
3.理解MySQL字符集使用
字符集是一套符号和编码的规则,字符串都必须有相应的字符集
校验集是这套符号和编码的校验规则,定义字符排序规则,字符串之间比较的规则
ASCII字符在不同字符集中,其所需的字节数是不一样的
非ASCII字符在不同字符集中,其所需的字节数是不一样的
多字节字符间是以字符进行比较,而非以字节为单位进行比较
校验集可以用于验证大小写、不同重音等是否一致
个别校验集是二进制的,基于字符对应的数值进行比较
XXX_bin将字符串中的每一个字符用二进制数据存储,区分大小写。
XXX_general_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。
XXX_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感
拉丁 128
gbk 2byte
utf8 3byte
utf8mb4 4byte
XXX_bin 排序不准确
XXX_general_cs 做国际内容推荐
针对 order by group by
1.show Variables like '%table_names' 查看lower_case_table_names的值,0代表区分,1代表不区分。
2.mysql对于类型为varchar数据默认不区分大小写,但如果该字段以“*_bin”编码的话会使mysql对其区分大小写。
3.mysql对于字段名的策略与var[char类型]数据相同。即:默认不区分大小写,但如果该字段是以“*_bin”编码的话会使mysql对其区分大小写。
4、mysql对于表名的策略与varchar类型数据相同。即:默认不区分大小写,但如果该表是以“*_bin”编码的话会使mysql对其区分大小写。
不同字符集编码
echo "知"|iconv -t gbk |hexdump
echo "知"|iconv |hexdump
echo "a" |iconv -t gbk | hexdump
echo "a" |iconv -t utf8 | hexdump
echo "知" | iconv -t UTF-16 | hexdump
locale
echo "知" | hexdump
file zst.txt 查看文件的字符编码
rpm -qf /usr/bin/file --查软件包
cat zst.txt | hexdump
转码
cat zst.txt |iconv -t gbk | hexdump utf8->gbk
select hexdump(c1) from tb;
0a \n 回车符
utf8-16
GBK: 2个字节
UTF8:3个字节
ASCII码:1字节(7bit)
latin1 :1字节
字节编码转换:全部通过unicode转换
VARCHAR(30)在UTF-8字符集下,最多可以写入几个英文(ASCII码)?
30
VARCHAR(30)在UTF-8字符集下,最大长度?最多可以写入几个中文字符?
30*3+1 30
VARCHAR(30),UTF-8字符集,最大长度?存储了?个汉字,字节数应该是:?
VARCHAR(30),UTF-8字符集,存储了30个英文,字节数应该是:?
VARCHAR(30),GBK字符集,存储了30个汉字,字节数应该是:?
30*2+1
VARCHAR(30),GBK字符集,存储了30个英文,字节数应该是:?
30*1+1
VARCHAR(30),LATIN1字符集,存储了15个汉字,字节数应该是:?
VARCHAR(30),LATIN1字符集,存储了30个英文,字节数应该是:?
show global variables like 'length%'; group_concat_max_len
show global variables like '%len'; ft_max_word_len
排序 group by 按分配大小
locale
locale -a | grep utf8
export LANG='en_US.UTF-8'
客户端需要为utf8
\s set names utf8
字符集支持多层面:
服务器层(server)
数据库层(database)
数据表(table)
字段(column)
连接(connection)
结果集(result)
服务端:server -> database => table => column
客户端:connection => result
动态修改客户端字符集:SET NAMES latin 1/gb2312/utf8;
无法动态修改服务端字符集
cat my3306.cnf | grep char
character_set_server = utf8
file u1.sql
iconv -f utf8 -t gbk u1.sql
iconv -f utf8 -t gbk u1.sql | hexdump
iconf -f utf8 -t gbk u1.sql > u2.sql
file u2.sql
file u1.sql
cat u1.sql
cat u2.sql
重点
理解不同工具都有字符集,在经过的交互中,建议配置成字符集是一致的。
推荐使用:UTF8,如果是公司内部编辑控制的内容:推荐GBK
不同字符集编码转换推荐:iconv, file,hexdump
500G 数据库需要转码
转码:GBK->UTF8
迁移
mysqldump
--where="1=1 limit 1000";
show create database db;
create table xx character_set=utf8;
dts 摩拜开源 Gravity canal