【数据库】数据库表名全部转换为小写

一、现象

先看现象:数据库表有大写、有小写。

二、探索过程

因为项目使用了 Spring + dorado 框架组合,原以为是框架配置问题,先尝试从配置文件着手,如下:

第一轮探索:从项目配置文件着手

<property name="hibernateProperties">
	<props>
		<!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop> -->
		<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
		<prop key="hibernate.show_sql">false</prop>
		<prop key="hibernate.hbm2ddl.auto">update</prop>
		<prop key="hibernate.connection.isolation">8</prop>
		<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
	</props>
</property>
hibernate.ejb.naming_strategy 表示用于指定用于创建数据库表和列名的命名策略(Naming Strategy)。命名策略决定了 Hibernate 如何将实体类的属性名、类名等映射到数据库表和列的名称。
org.hibernate.cfg.ImprovedNamingStrategy 表示在表和列名称之间使用下划线并将名称转换为小写,这在需要与已有数据库命名规范不匹配时很有用。

默认情况下,Hibernate使用物理命名策略(Physical Naming Strategy)和隐式命名策略(Implicit Naming Strategy)。物理命名策略是指实体类和属性名称直接映射到数据库表和列名称,而隐式命名策略则根据一定的规则生成这些名称。

application.properties文件中配置:

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.cfg.ImprovedNamingStrategy

spring.jpa.hibernate.naming.physical-strategy 表示用于指定Hibernate的物理命名策略(Physical Naming Strategy)。 

请注意,从 Hibernate 5 开始,推荐使用 org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 作为物理命名策略的默认实现。

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

当然,也可以自定义实现命名规则,我没有自己实现,下面的搬来的示例代码。

package com.example;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class MyPhysicalNamingStrategy implements PhysicalNamingStrategy {

    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        // 实现逻辑
        return name;
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        // 实现逻辑
        return name;
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        // 实现逻辑
        return name;
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        // 实现逻辑
        return name;
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        // 实现逻辑
        return name;
    }
}

经过上面配置,删除数据表后,重新运行项目 。

结果:☹️☹️☹️。依然是大写

第二轮探索:从数据库层面着手

经过上面的修改,发现还是不能生效后,带着疑问去看看数据库是不是有什么配置影响了。

果然,经过一顿搜索,发现MySQL数据库配置有一个名为 lower_case_table_names 的配置项,可以影响数据表的大小写。其配置值如下所示:

  • 0(或默认值): 表名和数据库名区分大小写。
  • 1: 表名和数据库名不区分大小写。在创建表和查询时,将它们视为大小写不敏感。
  • 2: 表名区分大小写,数据库名不区分大小写。在创建表时,表名大小写敏感;在查询时,表名大小写不敏感,但数据库名大小写敏感。

看了以上配置说明后,在MySQL配置文件(通常是 my.cnfmy.ini)中,添加以下行来设置:

[mysqld]
lower_case_table_names=1

请注意⚠️:

  • 在更改此设置后,可能需要重启MySQL服务才能使更改生效。
  • 在MySQL的官方文档中建议,在使用 lower_case_table_names 设置时,不要将其设置为0,以免在移植数据库到大小写不敏感的系统时造成问题。

 查看配置项:

show variables like 'lower_case_table_names%';

我在配置时,因为我使用了 docker 来运行 MySQL,所以在配置时遇到了如下问题:

1、docker-compose.yml 配置文件./mysql/conf/upload.cnf 挂载不上去,报错:

Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/host_mnt/opt/nginx/dockers/lnmp/mysql/conf/upload.cnf" to rootfs at "/etc/mysql/conf.d/upload.cnf": mount /host_mnt/opt/nginx/dockers/lnmp/mysql/conf/upload.cnf:/etc/mysql/conf.d/upload.cnf (via /proc/self/fd/9), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

经 google 后,是因为文件权限问题:

$ chmod 655 ./mysql/conf/upload.cnf

2、额外的配置文件(upload.cnf)不生效

直接进入容器后,查看了my.cnf 文件

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 256M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

注意以下两个目录,在 docker-compose.yml 是不是挂载正确: 

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

最后,重启 MySQL 容器,立即生效了。

最终结果:

三、总结

  1. 因为项目使用了比较老旧 dorado 框架技术,很容易联想到时框架本身问题。
  2. 对MySQL数据库基本配置不熟悉。

附录:docker-compose.yml文件

mysql57:
        image: mysql:5.7.44
        container_name: MySQL-5.7
        ports:
            - "3308:3306"
        command:
          --max_connections=1000
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
          --default-authentication-plugin=mysql_native_password
        restart: always
        volumes:
          - ./mysql/data:/var/lib/mysql
          - ./mysql/conf/my.cnf:/etc/my.cnf
          - ./mysql/conf/upload.cnf:/etc/mysql/conf.d/upload.cnf:rw
        environment:
            - MYSQL_ROOT_PASSWORD=kcsm@111
            - LOWER_CASE_TABLE_NAMES=1
        networks:
            - lnmp-network
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ThinkPHP 6 中默认使用的是小写字母的表名。如果你想要将表名转换为大写字母,可以在配置文件 config/database.php 中的 'identifier_quote_character' 配置项中设置为 `"`,这样所有表名都将被转换为大写字母。 例如: ``` 'identifier_quote_character' => '"', ``` 但是强烈不建议使用大写字母命名表名,因为大多数数据库系统都是区分大小写的,容易造成命名空间的混淆,导致程序运行错误。 ### 回答2: 在ThinkPHP6中,数据库表名转换可以通过配置文件进行设置,具体的配置项是`'db_table_name_convert'`。 首先,在`config/database.php`文件中,我们需要找到`'connections'`数组下的相应数据库连接配置项,例如`'mysql'`,然后在该配置项中加入`'db_table_name_convert'`这个配置项,如下所示: ```php 'mysql' => [ // ... 'db_table_name_convert' => true, // ... ], ``` 将`'db_table_name_convert'`设置为`true`,表示开启数据库表名转换功能。 默认情况下,ThinkPHP6会将数据库表名转换小写字母,加上数据表前缀,并用下划线连接单词。但如果我们将`'db_table_name_convert'`设置为`true`,则可以将数据库表名转换为大写字母。 例如,有一个名为`user_info`的表,如果开启数据库表名转换功能后,它会被转换为`USER_INFO`。 总之,要将数据库表名转换为大写字母,只需要将ThinkPHP6中相应的数据库连接配置项中的`'db_table_name_convert'`设置为`true`即可。使用这种方式可以灵活控制数据库表名的大小写格式。 ### 回答3: 在ThinkPHP6中,数据库表名转换为大写字母可以通过配置文件进行设置。具体步骤如下: 1. 打开项目目录下的`config`文件夹,找到`database.php`文件。 2. 打开`database.php`文件后,找到`'params'`数组中的`'table_name'`键,该键用于设置数据库表名转换规则。 3. 默认情况下,`'table_name'`的值为空数组`[]`,表示不对数据库表名进行任何转换操作。可以在该数组中设置转换规则。 4. 要将数据库表名转换为大写字母,可以设置`'table_name'`的值为`['strtolower' => 'strtoupper']`。这里的`'strtolower'`和`'strtoupper'`是PHP内置的函数,分别用于将字符串转换小写和大写。 5. 设置完成后,将`'database.php'`文件保存并关闭。 完成以上步骤后,在ThinkPHP6中使用数据库时,所有数据库表名都会被自动转换为大写字母。例如,数据库中的`user`表会被转换为`USER`。 需要注意的是,修改`database.php`配置文件后,需要重启项目才能生效。 以上就是将ThinkPHP6数据库表名转换为大写字母的方法,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值