发表于: 2017-11-21 17:39:34

1 544


今天完成的事情:改了表 又重来一遍 出现了新的问题 
明天计划的事情:再把这个框架整体调好 讲小课堂 
遇到的问题:重构了代码 在最后开发机resources插入数据时报错 发现是去掉了组名 和张鑫的冲突了

duplicate entry  重复条目

我的是polyfinance 张鑫的是polyFinance  

首先看一下 表结构

desc  resources

 

show create table resources;

CREATE TABLE `resources` (

  `id` int(8) NOT NULL AUTO_INCREMENT,

  `name` varchar(200) DEFAULT NULL,

  `resource` varchar(200) DEFAULT NULL,

  `strategy` varchar(200) DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `unique_name` (`name`)

) ENGINE=InnoDB AUTO_INCREMENT=1120 DEFAULT CHARSET=utf8

查了一下 mysql的字段值是默认忽略大小写

这里涉及到校对规则    字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则  .

一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束 。比如 utf8字符集,utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的校对规则;

*_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的 
*_cs: case sensitive collation,区分大小写   新版本貌似取消了 我是没看到
*_ci: case insensitive collation,不区分大小写 

所以更改这里的collation就可以  navicate操作简单 

   mysql 语句  alter table resources change name name varchar(200) binary;


成功更改了排序规则 但是 他还报了一个错误 1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

网上搜了一下 说是     在my.cnf 里面设置sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'在sql_mode 中去掉only_full_group_by 解决问题!

可是依然不知道sql_mode是什么?sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题 

sql_mode常用值5.7.x版本默认如下:ONLY_FULL_GROUP_BY

对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。

在严格模式下,不要让GROUP BY部分中的查询指向未选择的列,否则报错。这些看看就好 

然后回到我们原本的问题  可以直接建表的时候指定

或者直接  在 查询时指定collation select * from t1 where name = binary 'YOU';

到这里就结束了吗  事实上 这里发现 还比较复杂   除了字段 还涉及到列 表 数据库名的大小写敏感

这些就只做参考 不深究了  

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:
  1、数据库名与表名是严格区分大小写的;
  2、表的别名是严格区分大小写的;
  3、列名与列的别名在所有的情况下均是忽略大小写的;

      4、字段内容默认情况下是大小写不敏感的。

然而windows下 都不区分 

查看大小写区分命令            mysql> show variables like "%case%";

可以修改my.ini或者my.cnf lower_case_table_names=1  这个是表名
(0:区分;1:不区分) 注意请重启

更加具体的 请参考 官方文档 http://dev.mysql.com/doc/refman/5.7/en/charset-binary-collations.html

收获:邮箱从原先的时代继承来的 大小写不区分 密码大小写是否区分 看加密方式  用户名也不区分大小写了 麻烦


返回列表 返回列表
评论

    分享到