MySQL 编码标准和命名约定
MySQL 命名约定
引擎和字符集
引擎始终是MyISAM,除非在特殊情况下需要不同。所有数据库都必须使用 UTF8 字符集。
数据库
数据库名称必须与项目名称同名。如果项目名称为“我的网站”,则应将数据库创建为:
CREATE DATABASE mywebsite DEFAULT CHARSET UTF8;
表
所有表都必须采用 UTF8 编码。同一包中的所有表都必须具有前缀。使用 2 个或 3 个字母来描述要为数据库添加前缀的包。如果项目名称是Real Deal Marketing,最明显的前缀将是“rdm_”;
CREATE TABLE rdm_affiliates;
更改表和文件版本 major.minor[.build[.revision]]
所有表的所有更改都应保存在(database_name).sql文件中。如果数据库名称为“realdealmarketing”文件名应为 realdealmarketing-1.0.0.sql
- 初始文件必须为版本 1.0.0
- 如果只有表更改文件,则新版本应增加 0.0.1 示例:realdealmarketing-1.0.7.sql
- 如果创建新表,则必须将版本增加 0.1。示例:房地产交易营销-1.2.0.sql
- 如果删除表,则必须将版本提高 1.0。示例:realdealmarketing-2.0.0.sql
- 所有次要修订版都应具有遵循以下模式的适当文件名和版本:major.minor[.build[.revision]]
- 所有版本应保存在同一目录中
领域
本节说明如何创建数据库表字段以及如何为每个字段选择名称。
字段名称
字段名称必须以表名的 2-4 个字母为前缀。
字段名称始终以小写形式,用“_”分隔单词
例
DROP TABLE IF EXISTS rdm_affiliates;
CREATE TABLE IF NOT EXISTS rdm_affiliates
(
aff_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
aff_url VARCHAR(120) NOT NULL DEFAULT '',
aff_title VARCHAR(120) NOT NULL DEFAULT '',
aff_website CHAR(10) NOT NULL DEFAULT '',
aff_gender CHAR(8) NOT NULL DEFAULT '',
aff_landing_page VARCHAR(120) NOT NULL DEFAULT '',
aff_link VARCHAR(120) NOT NULL DEFAULT '',
aff_text TEXT,
PRIMARY KEY (aff_id),
INDEX (aff_website)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
所有字段名称都必须是描述性的,避免使用“唯一”、“排序”和保留字等名称。
空值和默认值
除AUTO_INCREAMENT、文本、日期(和类似字段)外的所有字段都必须定义为非空默认“值”
例子:
aff_title VARCHAR(120) NOT NULL DEFAULT ''
aff_gender ENUM('male','female') NOT NULL DEFAULT 'male'
user_id INT UNSIGNED NOT NULL DEFAULT 0
user_birthday DATE DEFAULT NULL
user_allow_newsletter TINYINT(1) UNSIGNED NOT NULL DEFAULT 0
art_text TEXT
指标
WHERE 和 ORDER BY 中的所有字段都应定义为 INDEX。如果您有这样的疑问:
SELECT * FROM table1 WHERE a='something' ORDER BY b
然后应将字段 a、b 视为索引
INDEX index_name (a,b)
查尔特指数
如果文本字段(CHAR、VARCHAR)用作较大表(> 5000 条记录)的索引,则应始终定义为 CHAR。例如,如果您有如下字段:
aff_url VARCHAR(255) NOT NULL DEFAULT ''
...
INDEX afiliate_url (aff_url)
为了提高性能,应将此表更改为如下所示
aff_url CHAR(20) NOT NULL DEFAULT ''
...
INDEX afiliate_url (aff_url)
查询
保留字应为大写以提高可读性。此外,尝试在多行中分隔长查询,而简单查询应保留在一行中。例:
SELECT a.field_name1, a.field_name2, COUNT(a.field3) AS cnt, b.*
FROM table1 AS a
LEFT JOIN table2 AS b ON (a.key_field = b.key_field)
RIGHT JOIN table3 AS c ON (a.key_field2 = c.key_field2)
WHERE a.field7 = 'something here' AND b.field9 = '45'
GROUP BY a.field_name1
ORDER BY a.field_name2 DESC, b.field8
HAVING cnt > 5
逃
始终在 WHERE 中转义值,即使值为整数
查询中的 PHP 变量
PHP 变量必须在查询之前定义并转义。
避免:
\(q = "SELECT * FROM users WHERE email='"._escape(\)_POST['email'])."' ";
用:
\(email = _escape(\)_POST['email']);
if (empty(\(email))
{
return false;
}
\)q = "SELECT * FROM users WHERE email='{$email}' ";
附录
PHPMyAdmin
尽量避免使用 PHP 我的管理员创建表,因为它存在默认值问题。它是浏览和简单数据库操作的绝佳产品,但它会让您懒惰,并且您通常会忘记保留表更改和其他更改的历史记录。