社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

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

数据库开发 • 6 年前 • 1019 次点击  

(点击上方公众号,可快速关注)


作者:散尽浮华

www.cnblogs.com/kevingrace/p/6150748.html

如有好文章投稿,请点击 → 这里了解详情


问题描述:


一开发同事在linux下调一个程序老是报错说找不到表,但是登陆mysql,show tables查看明明是已经创建了这张表的!!如下:


mysql> show tables;

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

| Tables_in_huan_db                         |

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

| advertisement                             |

| message_queue                             |

| message_sys_user                          |

| message_user                              |

| opHistory                                 |

| opHistory_queue                           |

| opHistory_queue_result_log                |

| opHistory_queue_send_fail_log             |

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

8 rows in set (0.00 sec)

mysql> desc opHistory;

ERROR 1146 (42S02): Table 'haun_db.opHistory' doesn't exist

mysql> desc opHistory_queue;

ERROR 1146 (42S02): Table 'haun_db.opHistory_queue' doesn't exist

mysql> desc opHistory_queue_result_log;

ERROR 1146 (42S02): Table 'haun_db.opHistory' doesn't exist

mysql> desc opHistory_queue_send_fail_log;

ERROR 1146 (42S02): Table 'haun_db.opHistory_queue_send_fail_log' doesn't exist


这张表明明存在,为什么程序就找不到表呢??


原因查找:


因为linux下mysql默认是要区分表名大小写的。mysql是否区分大小写设置是由参数lower_case_table_names决定的,其中:


1)lower_case_table_names = 0


区分大小写(即对大小写不敏感),默认是这种设置。这样设置后,在mysql里创建的表名带不带大写字母都没有影响,都可以正常读出和被引用。


mysql> show variables like "%case%";

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

| Variable_name          | Value |

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

| lower_case_file_system | ON    |

| lower_case_table_names | 0     |

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

2 rows in set (0.00 sec)


2)lower_case_table_names = 1


不区分大小写(即对大小写敏感)。这样设置后,表名在硬盘上以小写保存,MySQL将所有表名转换为小写存储和查找表上。该行为也适合数据库名和表的别名。


也就是说,mysql设置为不分区大小写后,创建库或表时,不管创建时使用大写字母,创建成功后,都是强制以小写保存!


mysql> show variables like "%case%";

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

| Variable_name          | Value |

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

| lower_case_file_system | OFF   |

| lower_case_table_names | 1     |

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

2 rows in set (0.00 sec)


上面的报错是因为:


开发之前在mysql里创建这张带有大写字母的表时,mysql还是默认的区分大小写设置,即对大小写不敏感。


后来运维同事又将mysql改成不分区大小写设置了,此时mysql都是强制以小写保存的表,所以开发后面再次在程序里引用这张表的时候,就会报错说不存在!


解决办法:


1)先在my.cnf里将lower_case_table_names参数再次调整为0,改成区分大小写


2)然后mysqladmin -uroot -p shutdown 以安全模式关闭数据库


3)登陆mysql数据库,”alter table 旧表名 rename 新表名” 将带大写字母的旧表改为小写表名


4)最后再启动mysql即可!


这里多说一下


MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:


1)数据库名与表名是严格区分大小写的;


2)表的别名是严格区分大小写的;


3)列名与列的别名在所有的情况下均是忽略大小写的;


4)变量名也是严格区分大小写的;


5)MySQL在Windows下都不区分大小写,但是在Linux下默认是区分大小写的。


6)如果想在查询时区分字段值的大小写,则字段值需要设置BINARY属性,设置的方法有多种:

    a)创建时设置:

        CREATE TABLE T(A VARCHAR(10) BINARY);

    b)使用alter修改


所以在不同操作系统中为了能使程序和数据库都能正常运行,最好的办法是在设计表的时候都转为小写!!


修改mysql为不区分大小写设置:


[root@test-huanqiu ~]# mysqladmin -uroot -p shutdown //以安全模式关闭数据库

[root@test -huanqiu ~]# cat /etc/my.cnf //添加下面一行设置

.....

[mysqld]

lower_case_table_names=1

.....

 

[root@test-huanqiu ~]# /etc/init.d/mysql start //启动mysql



看完本文有收获?请转发分享给更多人

关注「数据库开发」,提升 DB 技能


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/168keHmBn1
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2275
 
1019 次点击