NEW Allow setting sql_mode via config (#9721)

This commit is contained in:
Bernard Hamlin 2020-10-22 15:01:30 +13:00 committed by GitHub
parent 8c0ff67c55
commit f00f64120d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 9 deletions

View File

@ -1,7 +1,7 @@
---
title: Server Requirements
icon: server
summary: What you will need to run Silverstripe CMS on a web server
summary: What you will need to run Silverstripe CMS on a web server
---
@ -27,7 +27,11 @@ Use [phpinfo()](http://php.net/manual/en/function.phpinfo.php) to inspect your c
* PostgreSQL ([third party module](https://addons.silverstripe.org/add-ons/silverstripe/postgresql), community supported)
* SQL Server ([third party module](https://addons.silverstripe.org/add-ons/silverstripe/mssql), community supported)
* SQLite ([third party module](https://addons.silverstripe.org/add-ons/silverstripe/sqlite3), community supported)
### Connection mode (sql_mode) when using MySQL server >=5.7.5
In MySQL versions >=5.7.5, the `ANSI` sql_mode setting behaves differently and includes the `ONLY_FULL_GROUP_BY` setting. It is generally recommended to leave this setting as-is because it results in deterministic SQL. However, for some advanced cases, the sql_mode can be configured on the database connection via the configuration API (see `MySQLDatabase::$sql_mode` for more details.) This setting is only available in Silverstripe CMS 4.7 and later.
## Webserver Configuration
### Overview
@ -138,14 +142,14 @@ See [silverstripe/vendor-plugin](https://github.com/silverstripe/vendor-plugin)
The default installation includes [silverstripe/errorpage](https://addons.silverstripe.org/add-ons/silverstripe/errorpage),
which generates static error pages that bypass PHP execution when those pages are published in the CMS.
Once published, the static files are located in `public/assets/error-404.html` and `public/assets/error-500.html`.
The default `public/.htaccess` file is configured to have Apache serve those pages based on their HTTP status code.
The default `public/.htaccess` file is configured to have Apache serve those pages based on their HTTP status code.
### Other webservers (Nginx, IIS, Lighttpd)
Serving through webservers other than Apache requires more manual configuration,
since the defaults configured through `.htaccess` don't apply.
Please apply the considerations above to your webserver to ensure a secure hosting environment.
In particular, configure protected assets correctly to avoid exposing draft or protected files uploaded through the CMS.
In particular, configure protected assets correctly to avoid exposing draft or protected files uploaded through the CMS.
There are various community supported installation instructions for different environments.
Nginx is a popular choice, see [Nginx webserver configuration](https://forum.silverstripe.org/t/nginx-webserver-configuration/2246).
@ -182,9 +186,9 @@ SilverStripe's PHP support has changed over time and if you are looking to upgra
SilverStripe CMS supports the following web browsers:
* Google Chrome
* Internet Explorer 11
* Microsoft Edge
* Microsoft Edge
* Mozilla Firefox
We aim to provide satisfactory experiences in Apple Safari. SilverStripe CMS works well across Windows, Linux, and Mac operating systems.
## End user requirements

View File

@ -5,6 +5,7 @@
- [Experimental support for PHP 8](#experimental-support-for-php-8)
- [Support for Symfony 4 Components](#support-for-symfony-4-components)
- [Default MySQL collation updated](#default-mysql-collation-updated)
- [MySQL connection mode configurable](#mysql-connection-mode-now-configurable)
- [Flysystem dependency shifted](#flysystem-dependency-shifted)
## New features
@ -59,6 +60,10 @@ You can rectify this by upgrading MySQL, enabling the `innodb_large_prefix` sett
reducing the size of affected fields. If none of these solutions are currently suitable, you can
remove the new collation configuration to default back to the previous default collation.
### MySQL connection mode now configurable
In MySQL versions >=5.7.5, the `ANSI` sql_mode setting behaves differently and includes the `ONLY_FULL_GROUP_BY` setting. It is generally recommended to leave this setting as-is because it results in deterministic SQL. However, for some advanced cases, the sql_mode can now be configured on the database connection via the configuration API (see `MySQLDatabase::$sql_mode` for more details.)
### Flysystem dependency shifted
Previously the Flysystem package was pulled in via the `silverstripe/framework` module, but only
@ -71,4 +76,3 @@ An edgecase exists where a project can update to `silverstripe/framework 4.7.0`
`silverstripe/assets 1.6.x`, and lose the Flysystem dependency entirely. The best way to avoid this
is by ensuring you update all core modules to the new minor release at once, ideally through a core
recipe like `silverstripe/recipe-core`.

View File

@ -49,6 +49,15 @@ class MySQLDatabase extends Database implements TransactionManager
*/
private static $charset = 'utf8';
/**
* SQL Mode used on connections to MySQL. Defaults to ANSI. For basic ORM
* compatibility, this setting must always include ANSI or ANSI_QUOTES.
*
* @config
* @var string
*/
private static $sql_mode = 'ANSI';
/**
* Cache for getTransactionManager()
*
@ -84,8 +93,8 @@ class MySQLDatabase extends Database implements TransactionManager
// Notify connector of parameters
$this->connector->connect($parameters);
// This is important!
$this->setSQLMode('ANSI');
// Set sql_mode
$this->setSQLMode(static::config()->get('sql_mode'));
if (isset($parameters['timezone'])) {
$this->selectTimezone($parameters['timezone']);