问题是这样的:

一张test的表,字符集采用的latin1。

select to_id from test where to_id='cn象_王';

+---------------+

| to_id |

+---------------+

| cn陶_陶 |

| cn象_王 |

+---------------+

2 rows in set (0.00 sec)

取cn象_王的数据,居然把cn陶_陶的数据也取回来了。

这显然是不允许的。

查看它们的编码:

(root@im_offlog1a)[test]> select hex('cn陶_陶');

+----------------+

| hex('cn陶_陶') |

+----------------+

| 636ECCD55FCCD5 |

+----------------+

1 row in set (0.00 sec)

(root@im_offlog1a)[test]> select hex('cn象_王');

+----------------+

| hex('cn象_王') |

+----------------+

| 636ECFF35FCDF5 |

+----------------+

1 row in set (0.00 sec)

编码的确是不一样的,但是为什么mysql会认为这两条记录是一样的呢?

一开始我们就把问题定位于collation引起的问题。

show variables查看

| collation_connection | latin1_swedish_ci

| collation_database | latin1_swedish_ci

| collation_server | latin1_swedish_ci

手工把这些参数修改为latin1_bin,结果居然一样。这下感觉真是奇怪了。

这里先解释一下mysql collation的命名规则:

它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束

比如latin1字符集有以下几种校正规则:

校对规则 含义

latin1_german1_ci 德国DIN-1

latin1_swedish_ci 瑞典/芬兰

latin1_danish_ci 丹麦/挪威

latin1_german2_ci 德国 DIN-2

latin1_bin 符合latin1编码的二进制

latin1_general_ci 多种语言(西欧)

latin1_general_cs 多种语言(西欧ISO),大小写敏感

latin1_spanish_ci 现代西班牙

最后我们将表格重建,手工指定表格级别的collation为latin1_bin。

这个问题就得到了解决。

那么问题又来了,为什么我前面手工测试latin1_bin时不生效呢?

原来MySQL按照下面的方式选择表字符集和 校对规则:

如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y。

如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则。

否则,采用服务器字符集和服务器校对规则。

而我们在建表的时候指定了character set,所以它永远是采用对应的默认的校

mysql 查看collation_MySQL collation方法相关推荐

  1. mysql查看版本的方法

    在日常项目开发过程中,我们经常要连接自己的数据库,此时不知道数据库的版本是万万不可的.今天小树懒来给大家总结一下查看mysql版本的方法. MySQL查看版本的方法主要有以下四种 方法1: 没有连接到 ...

  2. mysql查看版本号的方法

    这里介绍四中不同的方法,它们分别运行在不同的环境中,最后对每种方法的优劣以及使用范围也做了总结. 1.直接在操作系统命令行下执行:MySQL –V C:>MySQL -V 2. MySQL 客户 ...

  3. MySQL查看表结构方法整理

    在Mysql的shell命令行下查询表的结构: 1.desc(描述)命令 desc tablename; describe tablename; 2.show命令 show columns from ...

  4. Mysql查看表结构的三种方法

    目录: mysql查看表结构 方法: show create table desc information_schema.COLUMNS 表结构: 获取所有的表结构及备注 根据库名导出所有表信息 根据 ...

  5. MySQL查看、创建和删除索引的方法

    本文实例讲述了MySQL查看.创建和删除索引的方法.分享给大家供大家参考.具体如下: 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别 ...

  6. linux mysql查看数据库编码_MySQL查看和修改字符编码的实现方法

    MySQL的默认编码是Latin1,不支持中文,要支持中午需要把数据库的默认编码修改为gbk或者utf8. 1.需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:&g ...

  7. mysql 查看当前数据库编码方式_MySQL查看与修改当前数据库编码的方法

    MySQL中,数据库的编码是一个相当重要的问题,有时候我们需要查看一下当前数据库的编码,甚至需要修改一下数据库编码. 查看当前数据库编码的SQL语句为: mysql> use xxx Datab ...

  8. mysql 当前用户连接数,查看mysql当前连接数的方法详解

    1.查看当前所有连接的详细资料: ./mysqladmin -uadmin -p -h10.140.1.1 processlist2.只查看当前连接数(Threads就是连接数.): ./mysqla ...

  9. navicat mysql 日志_使用Navicat查看MySQL日志的具体方法

    使用Navicat查看MySQL日志的具体方法 发布时间:2020-05-18 14:04:52 来源:51CTO 阅读:699 作者:三月 下文主要给大家带来使用Navicat查看MySQL日志的具 ...

最新文章

  1. qml 自定义消息框_Qt qml 自定义消息提示框
  2. 2台xenserver组成的资源池开启HA存在的问题
  3. win7系统下配置openCV python环境附加 numpy +scipy安装
  4. 珍惜那些爱你的人,不要令他们失望,加油吧,我们。
  5. 5.3.3 计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)
  6. oracle执行计划走偏处理步骤
  7. 如何用html构建ios应用,使用HTML5构建iOS原生APP
  8. 出现字迹模糊迹象_改变迹象:如何使用动态编程解决竞争性编程问题
  9. iOS开发之mac上搭建openfire服务器
  10. ReportViewer 安装
  11. vue-cli3使用vue-router 使用动态路由,在刷新页面时报错
  12. 使用jxls导出报错:Connot load XLS transformer please make sure a Transformer implementation is in classpath
  13. 《深度学习入门-基于Python的理论与实现》书籍介绍
  14. 暗月内网渗透实战——项目七
  15. NSFC 申请不中的反思 (内部讨论)
  16. 什么是动态 SQL
  17. mysql 大于当前时间条件查询
  18. 2020互联网大厂职级对应薪资一览表
  19. 16g电脑内存有什么好处_开车播放车载音乐 选择车载U盘有什么好处?
  20. 移动硬盘和Mac不兼容怎么办? Paragon和Tuxera对比

热门文章

  1. 基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的在线考试系统
  2. android java 调用栈_Android开发中打印方法调用栈
  3. Spring Boot的学习之路(02):和你一起阅读Spring Boot官网
  4. 如何做好部门以及公司的文档管理、知识管理以及情报管理?——By Me
  5. C++单目运算符的重载与双目运算符的重载【案例】
  6. java实现展示框,如何使用纯CSS实现蝴蝶标本的展示框效果
  7. python 字符串 包含 列表_python中包含字符串列表的列
  8. linux tee 日志输出_25 个 Linux 下最炫酷又强大的命令行神器,你用过其中哪几个呢?...
  9. 报告PPT|Python网络程序设计教学要点与案例分享(含音频)
  10. 详解Python对象属性