V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
PaperKite
V2EX  ›  MySQL

MySQL 字符集问题

  •  
  •   PaperKite · 2022-03-11 11:50:28 +08:00 · 2437 次点击
    这是一个创建于 988 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同一个 MySQL ,my.cnf 中配置了

    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    

    执行以下 SQL

    show variables like '%char%';
    show variables like 'collation%';
    

    MySQL cli 查询结果

    Variable_name Value
    character_set_client utf8
    character_set_connection utf8
    character_set_database utf8
    character_set_filesystem binary
    character_set_results utf8
    character_set_server utf8
    character_set_system utf8
    character_sets_dir /usr/share/mysql/charsets/

    Variable_name Value
    collation_connection utf8_general_ci
    collation_database utf8_general_ci
    collation_server utf8_general_ci

    navicat 、navicat 命令行、datagrip 结果

    Variable_name Value
    character_set_client utf8mb4
    character_set_connection utf8mb4
    character_set_database utf8
    character_set_filesystem binary
    character_set_results utf8mb4
    character_set_server utf8
    character_set_system utf8
    character_sets_dir /usr/local/mysql/share/charsets/

    Variable_name Value
    collation_connection utf8mb4_general_ci
    collation_database utf8_general_ci
    collation_server utf8_general_ci

    为何结果不同

    13 条回复    2022-03-11 15:13:12 +08:00
    Aluhao
        1
    Aluhao  
       2022-03-11 11:52:42 +08:00
    建议直接使用:utf8mb4
    PaperKite
        2
    PaperKite  
    OP
       2022-03-11 11:55:05 +08:00 via iPhone
    @Aluhao 主要是想问为何两个地方结果不一样
    LeslieWongH
        3
    LeslieWongH  
       2022-03-11 12:13:14 +08:00
    katsusan
        4
    katsusan  
       2022-03-11 12:54:36 +08:00   ❤️ 3
    navicat 连接 mysql 成功后会执行几条命令: set names xxx; show variables like 'lower_case_%'; ...

    如果连接信息里编码选的是 auto, 就会执行 set names utf8mb4.可以在你的命令行下试试看, 跟 navicat 一样的结果.
    PaperKite
        5
    PaperKite  
    OP
       2022-03-11 13:10:12 +08:00
    @katsusan #4 感谢。命令行执行了 set names utf8mb4 之后,确实和 navicat 一样的结果了,连接信息里编码也确实选的是 auto ; auto 切换成其他就跟最开始的命令行结果一致了。另外想问一下( navicat 连接 mysql 成功后会执行几条命令: set names xxx; show variables like 'lower_case_%'; ...)这个是如何了解到的
    comlewin
        6
    comlewin  
       2022-03-11 13:13:22 +08:00
    这可能就叫经验
    PaperKite
        7
    PaperKite  
    OP
       2022-03-11 13:16:05 +08:00
    @comlewin 可能这就是大佬吧👍
    chengyiqun
        8
    chengyiqun  
       2022-03-11 14:08:35 +08:00
    @PaperKite #7 你可以启动 navicat 后按 ctrl+H 查看命令行历史, navicat 作为 GUI 工具, 是记录了命令行交互历史记录哒
    PaperKite
        9
    PaperKite  
    OP
       2022-03-11 14:10:26 +08:00
    @chengyiqun 你说的是工具选项卡中的历史日志吗 我在里面没找到#4 说的内容
    liprais
        10
    liprais  
       2022-03-11 14:11:15 +08:00
    client 字符集是 client 设置的,你不设置当然就 follow server 的
    chengyiqun
        11
    chengyiqun  
       2022-03-11 14:12:45 +08:00
    @PaperKite #9 不知道, 可能是 navicat 版本不一样吧, 我司的分布式数据库就是和新版 navicat 兼容性不好, 所以我至今还在用 navicat11
    katsusan
        12
    katsusan  
       2022-03-11 14:22:01 +08:00   ❤️ 1
    @PaperKite #5
    > 想问一下( navicat 连接 mysql 成功后会执行几条命令: set names xxx; show variables like 'lower_case_%'; ...)这个是如何了解到的

    mysql 的 client 向 server 发送 query command 时用的是 text protocol, 在 unencrypted connection(no SSL)下用 tcpdump 抓包就能看到了. 协议在 https://dev.mysql.com/doc/internals/en/com-query.html.
    PaperKite
        13
    PaperKite  
    OP
       2022-03-11 15:13:12 +08:00
    @katsusan 感谢 抓包看到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2577 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:41 · PVG 10:41 · LAX 18:41 · JFK 21:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.