【问题标题】:MySQL regex function Turkish character problemMySQL正则表达式函数土耳其字符问题
【发布时间】:2019-08-01 11:18:07
【问题描述】:

我正在使用土耳其语中的 php 进行搜索。在土耳其字母表中,有 'i' 和 'ı' 小写字符。还有“I”和“İ”大写字符。

正则表达式函数中的Mysql选择查询找不到土耳其语字符,例如:İ-ı..我的搜索列数据类型字符集UTF-8 general_ci。

我在等你的答案。提前致谢。

【问题讨论】:

  • 我认为这是一个已知问题
  • 什么版本?在 MySQL 8.0 之前,正则表达式不适用于多字节字符。

标签: php mysql regex


【解决方案1】:

您可以通过以下方式解决土耳其语字符问题。

使用 HTML 和 JQuery 代码,如下所示;

function searchBarReplaceChar() {
        searchInput = $.trim($('input[name="replaceChar"]').val());

        let charMap = {
            Ç: '[CÇ]+',
            C: '[CÇ]+',
            Ö: '[OÖ]+',
            O: '[OÖ]+',
            Ş: '[SŞ]+',
            S: '[SŞ]+',
            İ: '[Iİ]+',
            I: '[Iİ]+',
            Ü: '[UÜ]+',
            U: '[UÜ]+',
            Ğ: '[GĞ]+',
            G: '[GĞ]+',
            ç: '[cç]+',
            c: '[cç]+',
            ö: '[oö]+',
            o: '[oö]+',
            ş: '[sş]+',
            s: '[sş]+',
            ı: '[ıi]+',
            i: '[ıi]+',
            ü: '[uü]+',
            u: '[uü]+',
            ğ: '[gğ]+',
            g: '[gğ]+',
        };

        let str_array = searchInput.split('');

        for (let i = 0, len = str_array.length; i < len; i++) {
            str_array[i] = charMap[str_array[i]] || str_array[i];
        }

        searchInput = str_array.join('');

        let replaceChar = searchInput.replace(/[]/gi, "");
        let lastChar = replaceChar.slice(-1);
        if (lastChar === '+') {
            replaceChar = replaceChar.slice(0, -1);
        }
        $('.result').text(replaceChar);
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" name="replaceChar" value="şehir bu gece çok güzel" />
<p class="result"></p>
<button type="submit" onclick="searchBarReplaceChar()" >Send</button>

使用 ajax post 将此结果发送到您的 php 文件。

稍后,你的php文件代码,

public function search_regexp() {
    $regexp = str_replace('i', 'İ', $_POST['get_replace_result']);
    $regexp = str_replace('ı', 'I', $regexp);
    $regexp = mb_strtoupper($regexp, "UTF-8");
    $sql_query = "SELECT * FROM your_table WHERE example_column regexp '$regexp'";
    // $sql_query = "SELECT * FROM your_table WHERE example_column regexp '[SŞ]+EH[Iİ]+R B[UÜ]+ [GĞ]+E[CÇ]+E [CÇ]+[OÖ]+K [GĞ]+[UÜ]+ZEL'";
}

别忘了这一点,mysql数据库中你的表列数据类型字符集utf8_turkish_ci

祝你好运

【讨论】:

    【解决方案2】:

    COLLATION utf8_turkish_ci(或 utf8mb4),只有这样,MySQL 才会处理

    I=ı  <  İ=i=Ì=Í=Î=Ï=ì=í=î=ï=Ĩ=ĩ=Ī=ī=Ĭ=ĭ=Į=į
    

    对于土耳其语,其他重音字母也得到了正确处理。也就是说,对于WHEREORDER BY,很少需要使用正则表达式来正确比较单词。

    (无需任何 PHP 代码。)

    更多详情:http://mysql.rjweb.org/utf8_collations.html

    该参考文献还指出Şş 就像st 之间的一个字母。等等。

    如果您的目标是定位行与ıİ,请详细说明。这可能涉及HEX()utf8_bin

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多