当前位置: 首页 > 科技观察

mysql表名忽略大小写问题记录

时间:2023-03-14 23:40:36 科技观察

问题描述:开发同事在linux中降级程序时总是报错找不到表,但是登录mysql显示表查看表已经创建!!如下:mysql>showtables;+-----------------------------------------+|Tables_in_huan_db|+----------------------------------------+|广告||message_queue||message_sys_user||message_user||opHistory||opHistory_queue||opHistory_queue_result_log||opHistory_queue_send_fail_log|+------------------------------------------+8rowsinset(0.00sec)mysql>descopHistory;ERROR1146(42S02):Table'haun_db.opHistory'doesn'texistmysql>descopHistory_queue;ERROR1146(42S02):表'haun_db.opHistory_queue'不'texistmysql>descopHistory_queue_result_log;ERROR1146(42S02):表'haun_db.opHistory'不'texistmysql>descopHistory_queue_send_fail_log;ERROR1146(42S02):表'haun_db.opHistory_queue_log_send;ERROR1146(42S02):表'haun_db.opHistory_queue_send_send_fail_log;找不到表??查找原因:因为linux下的mysql默认区分表名的大小写。mysql是否区分大小写由参数lower_case_table_names决定,其中:1)lower_case_table_names=0区分大小写(即不区分大小写),该设置为默认。这样设置后,在mysql中创建的表名有无大写字母都没有影响,可以正常读取和引用。mysql>showvariablelike"%case%";+------------------------+------+|Variable_name|Value|+-----------------------+--------+|lower_case_file_system|ON||lower_case_table_names|0|+-----------------------+--------+2rowsinset(0.00sec)2)lower_case_table_names=1caseinsensitive(即区分大小写)。这样设置后,表名以小写形式保存在硬盘上,MySQL将所有表名转换为小写形式,以便存储和查找表。此行为也适用于数据库名称和表别名。也就是说mysql设置了不区分大小写后,在创建库或表时,不管创建时使用的是大写字母,创建成功后,强制保存为小写!mysql>showvariableslike"%case%";+---------------------+------+|Variable_name|Value|+---------------------+--------+|lower_case_file_system|OFF||lower_case_table_names|1|+----------------------+--------+2rowsinset(0.00sec)上面的错误是因为:开发前在mysql中创建这个大写字母的表时,mysql还在默认区分大小写设置,即不区分大小写。后来运维同事把mysql改成了不区分大小写的设置。这时候mysql是一个强制用小写保存的表,所以开发之后在程序中再次引用这个表的时候,会报错说不存在!解决方法:1)首先将my.cnf中的lower_case_table_names参数调整为0,并改为区分大小写2)然后mysqladmin-uroot-pshutdown以安全模式关闭数据库3)登录mysql数据库,“altertableoldtablenamerenameNewtablename》将大写字母的旧表改成小写的表名4)最后,再次启动mysql!这里稍微说说Linux下MySQL数据库名、表名、列名、别名的大小写规则:1)数据库名和表名严格区分大小写;2)表别名严格区分大小写;3)列名和列别名在所有情况下都不区分大小写;4)变量名也是严格区分大小写的;5)MySQL在Windows下不区分大小写,但在Linux下默认是区分大小写的。6)查询时如果要区分字段值的大小写,需要给字段值设置BINARY属性。有多种设置方式:a)创建时设置:CREATETABLET(AVARCHAR(10)BINARY);b)使用alter修改所以为了让程序和数据库在不同的操作系统下正常运行,最好的办法就是在设计表的时候把它们都转成小写!!修改mysql不区分大小写:[root@test-huanqiu~]#mysqladmin-uroot-pshutdown//在安全模式下关闭数据库[root@test-huanqiu~]#cat/etc/my.cnf//添加下面一行设置.....[mysqld]lower_case_table_names=1.....[root@test-huanqiu~]#/etc/init.d/mysqlstart//启动mysql