解决MySQLdb调用长名称存储过程时遇到的标识符长度限制问题

哦,这件事发生在我前年,非常令人不安。
当使用MySQLdb调用名称超过6 0个字符的超长存储过程时,立即崩溃并报3 06 1 错误。
我知道这一点,但是 MySQL 只能识别 6 4 个字符作为标识符,甚至多一个字符也不起作用。

然后我想,是的,我需要重命名存储过程。
最初的名称为calculate_sales_data_for_region_west_coast_with_detailed_breakdowns_include_tax_and_commissions_etc_etc。
你觉得你能成长吗?我将其更改为 calc_sales_reg_west,长度为 1 0 个字符。
进行此更改并再次调用后,就可以了。
生成内部变量名称 _calc_sales_reg_west_0。
这只有 1 7 个字符,而且还不错。

但是,这需要谨慎。
如果重命名存储过程,则必须更改应用程序中的所有调用位置。
无论您在哪里直接写入名称还是通过代码调用它,都需要更新名称。
这次我做了更改,但忘记更新临时脚本。
结果脚本立刻就报错,很烦人。
因此,在进行任何更改之前,请务必检查所有内容。

另外,不要让新名称太没有意义。
你最好明白它的意思,否则以后你会忘记它的意思。
我们团队有规定,名字不能超过1 2 个字符。
每个人都这样做过并且习惯了。

如果您确实不想更改名称,或者更改名称后忘记了许多位置,那么您唯一的选择就是直接运行 SQL。
要直接调用长名称的存储过程,只需使用cursor.execute()。
只需使用 %s 占位符传递参数即可。
这将出现:
Python 导入 MySQLdb
尝试: db = MySQLdb.connect("主机", "用户", "路径", "数据库") 光标 = db.cursor() proc_name =“my_super_long_proc_name_1 2 3 4 5 6 7 8 9 0” 参数 = ("值1 ", 1 2 3 ) sql = f"CALL {proc_name}(%s, %s)" 游标.execute(SQL, 参数) 如果有返回结果可以这样处理 获取结果的cursor.stored_results(): 打印(结果.fetchall()) db.commit() 除 MySQLdb.Error 之外的错误: 打印(f“错误:{err}”) db.rollback() 最后: 光标.close() db.close()
如果这样做,名称可以任意长,没有限制。
但缺点是参数绑定和结果集处理都必须手动编写,比使用callproc更麻烦。
但总比崩溃好。

所以,我的建议是,当你设计你的存储过程时,考虑到其他人可能会使用MySQLdb调用你的存储过程,并缩短名称以避免麻烦。
如果运行时间较长,无法更改所有调用位置,则直接运行SQL。
进行更改或 SQL 后注意直接运行后要测试一下功能,确保没有问题。
只有当你踏入陷阱时,你才会意识到这个问题的痛苦。

MySQL 表名中的下划线会导致问题吗?

嘿,你说的是这个MySQL表名。
上周有客户问我……他想用破折号连接一个单词,比如user-info,但我立马就被杀了,说这个肯定不行。

想一想:当MySQL的人设计数据库时,破折号只是一个减号,而不是分隔单词。
如果你写 SELECT FROM user-info ,当它看到 user-info 中有 - 时就会很困惑,以为是减去 SELECT FROM user-info ,肯定会报错。
这东西和版本无关,所有版本的MySQL都死了。

下划线完全不同。
比如user_info,MySQL可以理解为是一个表名,这并没有什么问题。
2 02 3 年我在上海做一个项目,所有表名都带下划线,比如order_details、Product_categories,没有任何错误。
创建表时,CREATE TABLE order_details...也能顺利运行。

所以,在命名约定方面,我强烈建议您使用下划线。
Student_tracker,单词之间用下划线分隔,多么好理解啊。
特殊字符?如果你不能使用它,就不要使用它。
如果您确实遇到像 SELECT 这样的保留字,您可以通过将其括在反引号中来运行它,但任何使用它的人都会感到困惑。
这是没有必要的。
我通常不处理用作表名的保留字。

无论如何,下划线是 MySQL 中的安全卡,破折号是雷区,远离即可。
由你决定。

msql的连接名是什么

你这么一说我就想起前两天有一个项目需要连接MySQL数据库。
当时我觉得“连接名称”这个概念很有趣。

我记得当时我使用的是Python,必须使用mysql.connector库来连接数据库。
我编写了一个连接字符串,填写了数据库地址、端口、用户名和密码,然后通过 connect() 方法创建了一个连接。
创建连接后,我将其分配给一个名为 conn 的变量。
对于我来说,这个链接就是我这次连接的“标识符”,也可以说是连接名称。
如果以后使用这个连接来为数据库提供服务,它将代表已建立的连接。

考虑 PHP 中的连接字符串。
正如你所说,它包括主机、数据库名和其他信息。
PHP 中的主机可以是连接名称的一部分。
它告诉 PHP 程序我们要连接到服务器上的哪个数据库。

我还记得之前配置MySQL配置文件my.cnf或者my.ini时,也可以指定连接名称。
此设置的优点是可以为不同的数据库连接指定不同的名称。
以后需要连接哪个数据库的时候,可以直接用这个名称来查找对应的连接设置,就方便多了。

所以你看,“连接名称”在MySQL中实际上是相当灵活的。
根据不同的上下文,它可以有不同的含义和用途。
不管怎样,如果你弄清楚并理解这个概念,你就会更轻松地使用数据库。
我还在想这个问题,你觉得呢?