记——数据库大小写敏感情况下兼容系统中原有的sql语句

1、问题

       环境中MySQL数据库需要改成大小写敏感形式,而系统中存在着以前留下来的老sql,格式不规范,数目庞大,使用多种jdbc框架,如hibernate,jdbctemplate等;需要老sql的表名全部改为大写

2、mysql 大小写策略说明

my.cnf里将lower_case_table_names=1 表示对表名大写不敏感;

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

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

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

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

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

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

3、在应用中,sql存在的情况

现在应用持久化,一般有以下情况:mybatis, hibernate, jpa, spring jdbcTemplate、jdbc(原生)等

1) hibernate 中自动生成sql,表名一般是小写

2) Mybatic、jdbcTemplat、jdbc中有可能是自己编写的sql

3) jpa实际依赖实现(如hibernate), 可以认为类似hibernate

4、当应用需要适配大小写敏感的数据库时,有以下解决方案

1) 通过在druid连接池中中拦截待执行的sql,通过druid解析器获取这条sql中的所有表名,并将表名转为大写;

2) 当数据库为mysql时,通过在druid连接池中中拦截待执行的sql,将sql全部转成大写;这种方案的可行性在于mysql数据库对值是大小写不敏感的,这样在执行查询的时候将值直接转成大写不会影响

3)Hibernate 可以通过hibernate.physical_naming_strategy的实现进行改写。大致做法是,实现

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

重写方法:

public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) 

4)Mybatis 通过增加拦截器插件方式进行改写。如参考mybatis分页插件做法,是类似的。

5、我的处理方法

我的选择是方法1,原因是它能够比较好的兼容其他的数据库,以下为相关代码

1) 在druid配置中添加

<!-- 配置sql转大写 --> 
<property name="proxyFilters">
  	<list>
  		<ref bean="tableNamesToUppercaseFilter"/>
  	</list>
 </property>

 

2) 注册bean

<!-- sql转成大写配置 classPath需要自行替换为具体的路径-->
<bean id="tableNamesToUppercaseFilter" class="classPath.TableNamesToUppercaseFilter"></bean>

3) 重写 FilterEventAdapter


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在MySQL中,SQL语句大小写敏感与操作系统和配置有关。在Windows系统下,默认情况SQL语句是不区分大小写的,这意味着无论你使用大写还是小写字母编写SQL语句,MySQL都会将其解析为相同的语句。而在Linux系统下,默认情况SQL语句是区分大小写的,所以在编写SQL语句时需要注意大小写的正确性。 然而,需要注意的是,虽然SQL语句本身可能不区分大小写,但数据库名、表名和列名在不同操作系统下的区分大小写规则可能不同。在Windows系统下,数据库名、表名和列名是不区分大小写的,而在Linux系统下,默认情况下是区分大小写的。因此,在编写SQL语句时,建议统一使用小写字母或数字,以避免不同操作系统下的兼容性问题和错误。 总结来说,为了保证SQL语句的可移植性和一致性,建议始终使用小写字母或数字编写数据库名、表名和列名,并且遵循统一的命名规范。这样可以避免因操作系统不同而导致的大小写敏感性问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MySQL中SQL语句大小写规则(表名、字段名、字段值区分大小写吗?)](https://blog.csdn.net/LYY1448019681/article/details/111617308)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值