mysql中大小写敏感么

mysql中大小写敏感么,第1张

Windows环境下小写不敏感CREATETABLEtab(idINTAUTO_INCREMENT,valVARCHAR(10),PRIMARYKEY(id))mysql>select*fromtabEmptyset(0.00sec)mysql>select*fromTabEmptyset(0.00sec)mysql>select*from`Tab`Emptyset(0.00sec)在MySQL中如何在硬盘上保存和使用表名和数据库名由lower_case_tables_name系统变量确定,可以在启动mysqld时设置。lower_case_tables_name可以采用下面的任一值:值含义0使用CREATETABLE或CREATEDATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写不敏感的文件系统上用--lower-case-table-names=0强制设为0,并且使用不同的大小写访问MyISAM表名,会导致索引破坏。1表名在硬盘上以小写保存,名称比较对大小写敏感。MySQL将所有表名转换为小写以便存储和查找。该行为也适合数据库名和表的别名。该值为Windows和MacOSX系统中的默认值。2表名和数据库名在硬盘上使用CREATETABLE或CREATEDATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。注释:只在对大小写不敏感的文件系统上适用!InnoDB表名以小写保存,例如lower_case_tables_name=1。在Windows和MacOSX中,lower_case_tables_name的默认值是1。如果只在一个平台上使用MySQL,通常不需要更改lower_case_tables_name变量。然而,如果你想要在对大小写敏感不同的文件系统的平台之间转移表,会遇到困难。例如,在Unix中,my_tables和MY_tables是两个不同的表,但在Windows中,这两个表名相同。要想避免由于数据库或表名的大小写造成的数据转移问题,可使用两个选项:•在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOWTABLES或SHOWDATABASES时,看不出名字原来是用大写还是小写。•在Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。这样了可以保留数据库名和表名的大小写。不利之处是必须确保在Windows中查询总是用正确大小写引用数据库名和表名。如果将查询转移到Unix中,由于在Unix中大小写很重要,如果大小写不正确,它们不工作。例外:如果你正使用InnoDB表,在任何平台上均应将lower_case_tables_name设置为1,以强制将名转换为小写。请注意在Unix中将lower_case_tables_name设置为1之前,重启mysqld之前,必须先将旧的数据库名和表名转换为小写。

解决方案一:

于是怀疑Mysql的问题。做个实验:直接使用客户端用sql查询数据库。 发现的确是大小不敏感 。

通过查询资料发现需要设置collate(校对) 。 collate规则:

*_bin: 表示的是binary case sensitive collation,也就是说是区分大小写的

*_cs: case sensitive collation,区分大小写

*_ci: case insensitive collation,不区分大小写

解决方法。

1.可以将查询条件用binary()括起来。 比如:

?

1

select * from TableA where binary columnA ='aaa'

2. 可以修改该字段的collation 为 binary

比如:

?

1

ALTER TABLE TABLENAME MODIFY COLUMN COLUMNNAME VARCHAR(50) BINARY CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL

解决方案二:

mysql查询默认是不区分大小写的 如:

?

1

2

select * from some_table where str=‘abc'

select * from some_table where str='ABC'

得到的结果是一样的,如果我们需要进行区分的话可以按照如下方法来做:

第一种方法:

要让mysql查询区分大小写,可以:

?

1

2

select * from some_table where binary str='abc'

select * from some_table where binary str='ABC'

第二方法:

在建表时时候加以标识

?

1

2

3

create table some_table(

str char(20) binary

1、mysql默认情况下是否区分大小写,使用show Variables like '%table_names'查看lower_case_table_names的值,0代表区分,1代表不区分。

2、mysql对于类型为varchar数据默认不区分大小写,但如果该字段以“*_bin”编码的话会使mysql对其区分大小写。

3、mysql对于字段名的策略与varchar类型数据相同。即:默认不区分大小写,但如果该字段是以“*_bin”编码的话会使mysql对其区分大小写。

4、mysql对于表名的策略与varchar类型数据相同。即:默认不区分大小写,但如果该表是以“*_bin”编码的话会使mysql对其区分大小写。

5、如果按照第一项查看lower_case_table_names的值为0,但需要让mysql默认不区分大小写的话,需要在mysql配置文件中添加参数并重启mysql数据库。mysql配置文件的修改内容如下:

[mysqld]

...

lower_case_table_names = 1

6、注意:表和字段的编码尽量继承数据库的编码(不明显指定即继承),以免引起混乱。

LINUX下的MYSQL默认是要区分表名大小写的 ,而在windows下表名不区分大小写

让MYSQL不区分表名大小写的方法其实很简单:

1.用ROOT登录,修改/etc/my.cnf

2.在[mysqld]下加入一行:lower_case_table_names=1

3.重新启动数据库即可


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/8501793.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-17
下一篇2023-04-17

发表评论

登录后才能评论

评论列表(0条)

    保存