美文网首页
认识MySQL中的数据对象和字符集

认识MySQL中的数据对象和字符集

作者: 古飞_数据 | 来源:发表于2023-09-16 08:54 被阅读0次

    1.MySQL数据库中的对象
    2.为什么说MySQL不建议生产环境使用存储过程,如果必须要用,要考虑什么?
    3.理解MySQL字符集使用
    4.数据库升级、迁移乱码怎么处理

    1.MySQL数据库中的对象

    image.png

    2.为什么说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

    相关文章

      网友评论

          本文标题:认识MySQL中的数据对象和字符集

          本文链接:https://www.haomeiwen.com/subject/yttxzrtx.html