对象的大小写
库/表名的大小写
库/表名的大小写和平台有关。WINDOWS平台是不区分大小写的。LINUX/UNIX则可以区分,所以又有了lower_case_table_names参数来控制大小写是否敏感。
lower_case_table_names=0 表名存储为给定的大小写,名称比较是区分大小写的
lower_case_table_names=1 表名存储为小写,名称比较是不区分大小写的
lower_case_table_names=2 表名存储为给定的大小写,但MySQL在查找时将它们转换为小写字母。名称不区分大小写。这只适用于不区分大小写的文件系统。默认值是1,不区分库表名的大小写(都以小写来存储)
列、索引、存储过程、事件名的大小写
列、索引 、存储过程、事件不区分大小写
举例如下:
从这里可以看到,即使是大写的列名建表,其实还是不区分大小写的。
表数据的大小写
字符集
TELEDB的字符集规范
字符集的查看和修改
1、查看服务器的默认字符集和字符校验规则
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
部份私有化部署的MYSQL就不符合TELEDB的规范
2、查看数据库的默认字符集和字符校验规则
SHOW CREATE DATABASE database_name;
3、查看表的字符集和字符校验规则
SHOW CREATE TABLE table_name;
4、修改表的字符集和字符校验规则
ALTER TABLE table_name CONVERT TO CHARACTER SET charset_name COLLATE collation_name;
MYSQL的风险点在于可以指定每个库/表的字符集和校验规则。所以TELEDB规范中是明确反对这种做法的。
字符集对大小写的影响
MySQL:是否区分大小写由字符序(COLLATE)决定。一般"_ci"表示大小写不敏感(ci是 case insensitive, 即 "大小写不敏感");"_cs"表示大小写敏感(或者是bin二进制)。当字符序后缀为"_ci"时不区分大小写,主键或唯一键字段不能插入仅大小写不同的值,如'a'和’A'。
以utf8默认的utf8_general_ci较验规则为例子:
之所以没有字符校验规则 ,是因为utf8_general_ci是默认的字符校验规则
变更字符集较验的规则为大小写敏感:
ALTER TABLE t1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
所以TELEDB规范中要求统一使用utf8mb4,核对规则为utf8mb4_bin。这样才可以区分大小写。
MYSQL的大小写总结
1、库表名的大小写主要看lower_case_table_names配置参数。(一旦创建了数据库和表,在不删除现有对象的情况下更改 lower_case_table_names 的值可能会导致问题,因此在初始化 MySQL 服务器时应仔细考虑此设置。如果需要更改设置并保留数据,可能需要执行额外的步骤来迁移或重命名表。)
2、表数据的大小写主要看字符集的校验规则。