SELECT * FROM 模板 WHERE 模板名称=:模板名称,中文字段名作为占位符无法解析
1. 运行环境
CentOS Linux release 7.9.2009 (Core)
1). 当前使用的 Laravel 版本?
Laravel Framework 9.26.1
2). 当前使用的 php/php-fpm 版本?
PHP 版本:
PHP 8.1.6 (cli) (built: Jun 8 2022 18:43:33) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.6, Copyright (c) Zend Technologies
5). 相关软件版本
MYSQL 5.7
2. 问题描述?
// SQL 占位符为中文字符时执行报错
$exist = DB::selectOne('SELECT `id` FROM `模板` WHERE `模板名称`=:模板名称 AND `DEL`=0', [
'模板名称' =>'',
]);
// SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':模板名称 AND `DEL`=0' at line 1 (SQL: SELECT `id` FROM `模板` WHERE `模板名称`=:模板名称 AND `DEL`=0)
// 以下这种写法没有任何问题,只支持的
$exist = DB::table('模板')->where('模板名称', '')->where('DEL', 0)->first(['id']);
// 当前 SQL 在 MYQL 执行没有错误
mysql> SELECT `id` FROM `模板` WHERE `模板名称`='' AND `DEL`=0;
Empty set
3. 您期望得到的结果?
支持中文字段名占位符
方向:中文 –> Unicode –> PDO –> 源码
最后一次的 Google 检索词:
pdo bind named param unicode name
stackoverflow:PDO valid characters for placeholders