mirror of
https://github.com/moodle/moodle.git
synced 2025-03-14 04:30:15 +01:00
Merge branch 'MDL-51052_master' of https://github.com/dmonllao/moodle
This commit is contained in:
commit
ee3ca2d71b
@ -1502,10 +1502,13 @@ class mysqli_native_moodle_database extends moodle_database {
|
||||
/**
|
||||
* Returns 'LIKE' part of a query.
|
||||
*
|
||||
* Note that mysql does not support $casesensitive = true and $accentsensitive = false.
|
||||
* More information in http://bugs.mysql.com/bug.php?id=19567.
|
||||
*
|
||||
* @param string $fieldname usually name of the table column
|
||||
* @param string $param usually bound query parameter (?, :named)
|
||||
* @param bool $casesensitive use case sensitive search
|
||||
* @param bool $accensensitive use accent sensitive search (not all databases support accent insensitive)
|
||||
* @param bool $accensensitive use accent sensitive search (ignored if $casesensitive is true)
|
||||
* @param bool $notlike true means "NOT LIKE"
|
||||
* @param string $escapechar escape char for '%' and '_'
|
||||
* @return string SQL code fragment
|
||||
@ -1517,14 +1520,24 @@ class mysqli_native_moodle_database extends moodle_database {
|
||||
$escapechar = $this->mysqli->real_escape_string($escapechar); // prevents problems with C-style escapes of enclosing '\'
|
||||
|
||||
$LIKE = $notlike ? 'NOT LIKE' : 'LIKE';
|
||||
|
||||
if ($casesensitive) {
|
||||
// Current MySQL versions do not support case sensitive and accent insensitive.
|
||||
return "$fieldname $LIKE $param COLLATE utf8_bin ESCAPE '$escapechar'";
|
||||
|
||||
} else if ($accentsensitive) {
|
||||
// Case insensitive and accent sensitive, we can force a binary comparison once all texts are using the same case.
|
||||
return "LOWER($fieldname) $LIKE LOWER($param) COLLATE utf8_bin ESCAPE '$escapechar'";
|
||||
|
||||
} else {
|
||||
if ($accentsensitive) {
|
||||
return "LOWER($fieldname) $LIKE LOWER($param) COLLATE utf8_bin ESCAPE '$escapechar'";
|
||||
} else {
|
||||
return "$fieldname $LIKE $param ESCAPE '$escapechar'";
|
||||
// Case insensitive and accent insensitive.
|
||||
$collation = '';
|
||||
if ($this->get_dbcollation() == 'utf8_bin') {
|
||||
// Force a case insensitive comparison if using utf8_bin.
|
||||
$collation = 'COLLATE utf8_unicode_ci';
|
||||
}
|
||||
|
||||
return "$fieldname $LIKE $param $collation ESCAPE '$escapechar'";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3870,6 +3870,11 @@ class core_dml_testcase extends database_driver_testcase {
|
||||
$records = $DB->get_records_sql($sql, array('aui'));
|
||||
$this->assertCount(1, $records);
|
||||
|
||||
// Test LIKE under unusual collations.
|
||||
$sql = "SELECT * FROM {{$tablename}} WHERE ".$DB->sql_like('name', '?', false, false);
|
||||
$records = $DB->get_records_sql($sql, array("%dup_r%"));
|
||||
$this->assertCount(2, $records);
|
||||
|
||||
$sql = "SELECT * FROM {{$tablename}} WHERE ".$DB->sql_like('name', '?', true, true, true); // NOT LIKE.
|
||||
$records = $DB->get_records_sql($sql, array("%o%"));
|
||||
$this->assertCount(3, $records);
|
||||
|
Loading…
x
Reference in New Issue
Block a user