Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow setting sql_mode via config #9721

Merged
merged 5 commits into from
Oct 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions docs/en/00_Getting_Started/00_Server_Requirements.md
Original file line number Diff line number Diff line change
@@ -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
---


Expand All @@ -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
Expand Down Expand Up @@ -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).
Expand Down Expand Up @@ -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
Expand Down
6 changes: 5 additions & 1 deletion docs/en/04_Changelogs/4.7.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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`.

13 changes: 11 additions & 2 deletions src/ORM/Connect/MySQLDatabase.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
*
Expand Down Expand Up @@ -84,8 +93,8 @@ public function connect($parameters)
// 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']);
Expand Down