问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL Error:1146,SQLState:42S02 异常怎么解决?

发布网友 发布时间:2022-04-28 15:33

我来回答

2个回答

懂视网 时间:2022-05-03 04:12

How table and database names are stored on disk and used in MySQL is affected by the lower_case_table_names system variable, which you can set when startingmysqld. lower_case_table_names can take the values shown in the following table. This variable does not affect case sensitivity of trigger identifiers. On Unix, the default value of lower_case_table_names is 0. On Windows, the default value is 1. On macOS, the default value is 2.

Linux下面 lower_case_table_names 默认是0,Windows下默认是1,MacOS默认是2;

他们的含义如下:

lower_case_table_names=0  库名表名存储为给定的大小和比较是区分大小写的
lower_case_table_names = 1 库名表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=2  库名表名存储为给定的大小写但是比较的时候是小写的

3. 存在的问题1:

如果从Windows平台迁移到Linux平台,原来的库名和表名是不区分大小写的;比如一个user表,他是小写存储,但是sql语句里面使用:

select * from user 和 select * from USER 或者 select * from User都是一样的,因为在查找比较是是不区分大小的;

先要迁移到Linux平台,导入之后 库名表名也是小写存储,但是库名表名在比较查找时是区分大小写的,所以:

只有 select * from user是可以找到user表对应的存储在Linux下的文件的,其他任何形式都是无法找到表的;

解决方法:迁移到Linux平台之后,将 lower_case_table_names 的值改成1;也就是在查找比较时不区分大小写就可以了;

存在的风险:比如Linux平台原来有 tuser 表和 TUSER表,因为原来是区分大小写的,他们对应的是不同的表和存储文件,现在改成不区分大小写,那么问题就出现了!表名冲突了。不过这种情况比较少见。相对而言还是比较安全的。

 

4. 存在的问题2:

如果是从Linux平台迁移到Windows平台,原来的库名和表名是区分大小写的;现在迁移到Windows平台,不区分大小写,

比如原来有 tuser 表和 TUSER表,因为原来是区分大小写的,他们对应的是不同的表和存储文件,现在改成不区分大小写,那么问题就出现了!!!表名冲突了!不过这种情况比较少见。

解决方法:迁移到Windows平台之后,将 lower_case_table_names 的值改成0;也就是在查找比较时区分大小写就可以了;

存在的风险:存储和比较都是区分大小写了,比如原来windows平台的 select * from user 和 select * from USER都是合法的,现在导致 select * from USER会找不到表名了!!!

所以从 linux平台迁移到 windows平台是,一般是不需要修改 将 lower_case_table_names 的值改成0的,因为表名冲突的情况及其罕见。从区分大小写到不区分大小写在一般情况下面是兼容的。

而且如果windows平台的数据库存在之前的数据库,修改之后,导致应用系统的sql找不到表名,这个问题更加严重!

5. 建议

  • Use lower_case_table_names=1 on all systems. The main disadvantage with this is that when you use SHOW TABLES or SHOW DATABASES, you do not see the names in their original lettercase.

  • Use lower_case_table_names=0 on Unix and lower_case_table_names=2 on Windows. This preserves the lettercase of database and table names. The disadvantage of this is that you must ensure that your statements always refer to your database and table names with the correct lettercase on Windows. If you transfer your statements to Unix, where lettercase is significant, they do not work if the lettercase is incorrect.

    Exception: If you are using InnoDB tables and you are trying to avoid these data transfer problems, you should set lower_case_table_names to 1 on all platforms to force names to be converted to lowercase.

  • 如果不存在在不同平台迁移的情况,那么保持默认值即可。

    如果存在Linux和Windows平台之间进行迁移的情况,那么在一开始的时候任何平台设置lower_case_table_names=1可以避免问题;

    设置lower_case_table_names=1唯一的问题是, show tables 和 show databases 看到的不是你新建表和数据库时指定的大小写字母。

    6. 总结

    0. 其实掌握原理:MySQL的库名和表名对应到文件目录和文件,然后Linux区分目录和文件名称大小写,而Windows平台不区分,其他的东西都可以推演处理;

    1. 在windows和linux平台之间迁移时,需要修改   lower_case_table_names = 1;而Linux向Windows平台迁移时,一般不需要修改改参数;

    2. 在任何平台一开始的时候就设置 lower_case_table_names=1 可以解决平台迁移时存在的问题;

    3. 触发器名称的比较不是由lower_case_table_names来控制的;

     

    lower_case_table_names和数据库在Linux和windows平台之间的相互迁移问题

    标签:指定   nbsp   cts   https   ems   triggers   color   htm   数据库名   

    热心网友 时间:2022-05-03 01:20

    编辑MySQL安装目录下的my.ini文件,在[mysqld]节下 添加 lower_case_table_names=1

    1、这个问题的根源在于,在 MySQL 中,数据库和表其实就是数据目录下的目录和文件,因而,操作系统的敏感性决定数据库和表命名的大小写敏感,这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix/Linux 系统中是大小写敏感的。

    2、MySQL大小写敏感可以通过配置文件的lower_case_table_names参数来控制WINDOWS编辑MySQL安装目录下的my.ini 文件,在[mysqld]节下 添加 lower_case_table_names=0 (备注:为0时大小写敏感,为1时大小写不敏感,默认为1),可以实现MySql按照建表Sql语句的大小写状态来定义表名。

    3、LINUX编辑/etc/my.cnf文件,在[mysqld]节下 lower_case_table_names=1 参数,并设置相应的值 备注为0时大小写敏感,为1时大小写不敏感,默认为0。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 世界上最大的糖果公司是哪家? mysql 为什么有些字段首字母是大写的在插入时会变成小写? mysql大小写敏感开关有数字怎么办 大段文字存储到mysql数据库的问题 搜集关于国外著名糖果品牌的中、英文名字以及糖果的简介~谢谢 美国著名糖果及品牌 我不要糊弄的。 世界上著名糖果品牌,不是巧克力品牌~谢谢 进口糖果品牌有哪些? windows中没explorer.exe文件? 电脑版钉钉在直播课的时候怎么关闭前置摄像头? 怎么使用血压计听诊器 工作原理是什么 关于物理(声现象) 听诊器的工作原理是什么? 用物理知识解释 听诊器的工作原理(用初二的物理答)!!!急求 听诊器是通过什么把声音传播到耳朵里的 听诊器的工作原理。五十字左右 初二物理听诊器的工作原理 电脑如何进行硬盘分区 怎么对硬盘进行分区 谷歌浏览器和火狐浏览器 哪个比较好?懂的介绍下?推荐个谢谢,我现在用的... 一个浏览器懂得/ oracle移植到mysql注意事项 我的花呗被风控了,我还可以用花呗购物吗?还可以支付吗? 上个星期饿了吗与起点还能用花呗支付,为什么这个星期就不能了 "诺和锐30特充和笔芯有啥区别啊?求答案 胰岛素中的预填充和特充是什么意思啊 诺和锐特充和诺和锐30特充有什么不同 诺和锐特充和诺和灵R可以通用一个诺和笔吗?诺和锐笔芯和诺和灵R可以用一个诺和笔吗?用些不太明白。 诺和锐、诺和锐30、诺和锐特充、诺和锐30特充这四者一样吗,特充是什么意思 门冬胰岛素30 诺和锐的使用 以及刻度 疫苗预填冲什么意思 ”来得时预填充“的针头是可换的还是固定的? 门冬胰岛素30和门冬胰岛素30特充有什么区别? 门冬胰岛素和门冬胰岛素30有啥区别? 门冬胰岛素特充和门冬胰岛素30特区别 来得时甘精胰岛素注射液预填充<MAT>184700型能重复使用吗?怎么拆卸? 全新MG6制动预填充是什么技术? 诺和锐特充和诺和锐30特充有何不同? 诺和锐30特充笔怎样安装笔芯 您好 想问下有像来得时甘精胰岛素又不是那种预填充式的吗 每次都是一次性的用完就丢了太浪费了 关于CAD的预定义填充问题