用户
 找回密码
 入住 CI 中国社区
搜索
查看: 68|回复: 0
收起左侧

[数据库] CI在MySQL的sql-mode包含了ANSI_QUOTES时候的一个Bug

[复制链接]
发表于 2018-11-29 10:44:39 | 显示全部楼层 |阅读模式
如果mysql的sql-mode包含了ANSI_QUOTES(在my.ini 内设置),就是sql语句必须用单引号来包括字符串,则CI版本3.1.2以上的版本连接数据库都会报:


```
A PHP Error was encountered
Severity: Warning


Message: mysqli::real_connect(): (42S22/1054): Unknown column 'STRICT_ALL_TABLES,' in 'field list'


Filename: mysqli/mysqli_driver.php


Line Number: 201


Backtrace:
```
如果CI版本是3.0.2 或者以下的则不会报错。看源代码:
3.1.2的mysqli_driver.php的 的db方法


```
                                $this->_mysqli->options(MYSQLI_INIT_COMMAND,
                                        'SET SESSION sql_mode =
                                        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
                                        @@sql_mode,
                                        "STRICT_ALL_TABLES,", ""),
                                        ",STRICT_ALL_TABLES", ""),
                                        "STRICT_ALL_TABLES", ""),
                                        "STRICT_TRANS_TABLES,", ""),
                                        ",STRICT_TRANS_TABLES", ""),
                                        "STRICT_TRANS_TABLES", "")'
                                );
```
就是这里使用了双引号。
**修正方法是这里修改为单引号。**
当然在3.0.2的版本中没有这个设定,不过有一个代码(3.1.2 版本之上也有):


```
$mysqli->options(MYSQLI_INIT_COMMAND, 'SET SESSION sql_mode="STRICT_ALL_TABLES"');
```
在条件成立的时候也会报错,解决办法也是双引号改为单引号,
当然您也可以修改sql-mode,把ANSI_QUOTES 去掉。
这样就所有版本都不会报错了。
**结论是写sql还是用单引号吧。**


mysql 的把本是5.7 ,sql-mode参数是:
sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES"






评分

参与人数 1威望 +5 收起 理由
Hex + 5 很给力!

查看全部评分

本版积分规则