PHP创建数据库本身不支持加密,所谓“建库加密”实为数据存储层或字段级加密;MySQL表级加密需服务端配置且PHP不参与;PHP层应采用sodium_crypto_secretbox()等对敏感字段加密,并严格管理密钥与处理二进制数据。
PHP 的 mysqli 或 PDO 扩展执行 CREATE DATABASE 语句时,只是向 MySQL/MariaDB 发送指令,而 MySQL 本身不提供「加密数据库」这种抽象概念——它没有“创建一个默认全加密的库”的语法。所谓

MySQL 5.7+ 支持 InnoDB 表空间加密,但这是服务端功能,和 PHP 无关:
innodb_encrypt_tables=ON 等参数,并配置密钥环插件(如 keyring_file)ENCRYPTION='Y',例如:CREATE TABLE users (id INT) ENCRYPTION='Y';
在 PHP 写入前对敏感字段(如身份证、手机号、token)加密,读取后解密。关键点:
sodium_crypto_secretbox()(推荐)或 openssl_encrypt(),避免已废弃的 mcrypt
bin2hex()),对应字段类型设为 VARCHAR 或 TEXT
$key = sodium_hex2bin($_ENV['ENCRYPTION_KEY']); // 32 字节 hex key $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); $ciphertext = sodium_crypto_secretbox($plain, $nonce, $key); $stored = bin2hex($nonce . $ciphertext); // 拼接 nonce + 密文
$nonce(前 24 字节),再调用 sodium_crypto_secretbox_open()
用户密码必须用 password_hash() 哈希(不可逆),不是加密;而银行卡号、地址等需要可逆操作的字段才用加密。混用会导致无法还原数据或严重安全漏洞。
真正难的不是写几行加密代码,而是密钥生命周期管理、加密字段的查询限制(比如无法用 WHERE phone = ? 直接查加密值)、以及是否遗漏了日志/缓存/备份中的明文残留。