如果表名或列名包含大写字母,我想知道这是否有问题。有些东西让我相信数据库在保持小写的情况下可以减少麻烦。真的吗?哪些数据库不喜欢表名和列名中的任何大写符号?
我需要知道,因为我的框架从ER模型自动生成关系模型。
(这个问题不是关于它的好坏风格,而是关于它是否是任何数据库的技术问题)
答案 0 :(得分:20)
据我所知,使用大写和小写都没有问题。使用小写约定的一个原因是使用小写表和列名称以及大写sql关键字来查询更具可读性:
SELECT column_a, column_b FROM table_name WHERE column_a = 'test'
答案 1 :(得分:17)
SQL-92标准指定标识符和关键字不区分大小写(根据 SQL标准指南第4版,日期/ Darwen)
这并不是说特定的DBMS不是(1)坏了,或者(2)可配置(和坏了)
从编程风格的角度来看,我建议对关键字和标识符使用不同的案例。就个人而言,我喜欢大写标识符和小写关键字,因为它突出显示了您正在操作的数据。
答案 2 :(得分:15)
对于数据库来说,对于我所知道的任何数据库引擎,在表名或列名中都有大写字母不是技术问题。请记住,许多数据库实现使用区分大小写的名称,因此始终使用与创建它们相同的大小写来引用表和列(我说的非常普遍,因为您没有指定特定的实现)。
对于MySQL,这里有一些关于它如何处理标识符情况的有趣信息。您可以设置一些选项来确定它们在内部的存储方式。 http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html
答案 3 :(得分:5)
据我所知,共同的L.A.M.P.设置它并不重要 - 但请注意,Linux上托管的MySQL区分大小写!
为了保持我的代码整洁,我通常坚持使用表格和列的小写名称,大写的MySQL代码和混合的大小写变量 - 如下所示:
SELECT * FROM my_table WHERE id ='$ myNewID'
答案 4 :(得分:4)
对于表名(通常),我使用pascal case作为字段名称小写,如下所示:
students
--------
ID
FirstName
LastName
Email
HomeAddress
courses
-------
ID
Name
Code
[etc]
为什么这很酷?因为它可读,因为我可以解析为:
echo preg_replace('/([a-z])([A-Z])/','$1 $2',$field); //insert a space
现在,这里是桌子的有趣部分:
StudentsCourses
--------------
Students_ID
Courses_ID
AcademicYear
Semester
注意我把S和C大写了?这样他们就会回到主表。您甚至可以编写一个例程来以这种方式逻辑地解析db结构并自动构建查询。所以我在表格中使用大写,就像在这种情况下一样是JOIN表。
同样,将_视为 - >在此表中为:学生 - > ID和课程 - > ID 不是student_id - 而是Students_ID - 字段的同源字符与表格的确切名称相匹配。
使用这些简单的约定会生成一个可读的协议,它可以处理大约70%的典型关系结构。
答案 5 :(得分:3)
SQL标准要求标识符以全大写形式存储。请参阅另一个问题的草稿副本in this Answer中引用的SQL-92的第5.2.13节。该标准允许您使用小写或混合大小写的无限制标识符,因为SQL处理器需要根据需要进行转换以转换为大写版本。
这个要求大概可以追溯到SQL的早期阶段,当时大型机系统仅限于大写英文字符。
许多数据库都忽略了该标准的要求。 Postgres特别恰恰相反,将所有未加引号(“无限制”)的标识符转换为小写 - 尽管Postgres否则比我知道的任何其他系统更接近标准。某些数据库可能会在您指定的情况下存储标识符。
通常这不是问题。实际上,所有数据库都会根据标识符使用的案例对数据库存储的案例进行不区分大小写的查找。
偶尔出现奇怪的情况,您可能需要在其存储的情况下指定标识符,或者您可能需要指定全大写。某些实用程序可能会发生这种情况,您必须将标识符作为字符串传递到通常的SQL处理器上下文之外。很少见,但是如果你在使用一些不寻常的工具/实用工具时遇到一些神秘的“找不到表”的错误信息,请把它塞在脑后。曾经发生过我一次。
现在的常见做法似乎是使用全部小写,并用下划线分隔单词。这种风格称为Snake case。
如果您的标识符全部以大写(或全部小写)显示,则使用下划线而不是Camel case会有所帮助,从而在没有单词分隔的情况下失去可读性。
额外提示:SQL标准(SQL-92第5.2.11节)明确承诺永远不会在关键字中使用尾随下划线。因此,在所有标识符上附加一个尾随下划线,以消除所有意外碰撞的担忧。
答案 6 :(得分:2)
无论您使用什么,请记住Linux上的MySQL区分大小写,而在Windows上则不区分大小写。
答案 7 :(得分:1)
例如,如果您正在使用postgresql和PHP,则必须按如下方式编写查询:
$sql = "SELECT somecolumn FROM \"MyMixedCaseTable\" where somerow= '$somevar'";
“引用标识符也使其区分大小写,而不带引号的名称始终折叠为小写。例如,PostgreSQL认为标识符FOO,foo和”foo“相同,但”Foo“和” FOO“与这三者相互不同。(在PostgreSQL中将不带引号的名称折叠成小写字母与SQL标准不兼容,后者表示不带引号的名称应该折叠成大写。因此,foo应该等同于”FOO“ “不”foo“根据标准。如果你想编写便携式应用程序,建议你总是引用一个特定的名称或从不引用它。)” http://www.postgresql.org/docs/8.4/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
所以,有时候,这取决于你在做什么......
答案 8 :(得分:1)
在 PostgreSQL 中,必须使用双引号或大小写混合的列名。如果您以后不想担心它,请以小写字母命名。
MySQL -列绝对不区分大小写。这可能会导致问题。假设有人写了“ mynAme”而不是“ myName”。该系统可以正常工作,但是一旦某些开发人员通过源代码搜索它,他们可能会忽略它,并且所有人都会遇到麻烦。
答案 9 :(得分:0)
没有现代数据库无法处理大写或小写文本。
答案 10 :(得分:0)
这是值得强调的:如果二进制或区分大小写的排序规则有效,那么(至少在Sql Server和其他具有丰富排序规则功能的数据库中)标识符和变量名将区分大小写。您甚至可以创建名称仅大小写不同的表。 (—我不确定上面有关sql-92标准的信息是否正确,如果是,则该标准的这一部分并未得到广泛遵循。)