MySQL排序规则

3
我在开发PHP和MySQL时遇到了一个非常奇怪的问题。我4-5年前曾经遇到过这个问题,但自那以后就再也没有出现过。我真的不记得当时是怎么解决的。
问题是:我的数据库使用utf_unicode_ci排序规则,但是当我插入格鲁吉亚文字(სახელი და გვარი)时,数据库中会显示მიხეირ<- 这些符号。这个问题可能是什么?如何解决?
有什么想法吗?

看一下这个帖子:https://dev59.com/Zmw05IYBdhLWcg3wuUAL#7073506 我认为我在那里的回答可能有助于解释可能存在的问题。 - gview
4个回答

3
根据Eray的回答,我意识到应该在排序规则中设置utf8_general_ci而不是utf8_unicode_ci,并且还需要使用mysql_set_charset('utf8', $connection)函数。以下是示例:
        $connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS);
    mysql_set_charset('utf8',$connection);      
    if (!$connection) {
        die("Database connection failed: " . mysql_error());
    } else {
        $db_select = mysql_select_db(DB_NAME, $connection);
        if (!$db_select) {
            die("Database selection failed: " . mysql_error());
        }
    }
}

在第二行加上 mysql_set_charset 解决了我的问题。

希望能对大家有所帮助。


2

你可以尝试使用utf8_general_ci代替当前的字符集,这样可以解决你的问题。

但是请注意,*数据库*和*表格*的字符集必须为utf8_general_ci


1
排序规则(collation)与错误的字符集显示有什么关系? - gview
表的排序规则决定了排序顺序。这与此问题无关。 - gview
问题不是关于排序吗? - Eray

0

确保您正在使用带有 N 前缀的字符串类型(NCHAR,NVARCHAR)之一。

不要忘记在向数据库添加数据时将N添加到传递的参数中。例如:

INSERT INTO table VALUES (N'Georgian Letters', N'Georgian Letters', ...)

N前缀将告诉SQL其后的字符串是Unicode字符串。


0
我可以肯定的是,你遇到的问题与排序规则无关。它与字符集和编码有关,很可能问题不在于将数据插入数据库时,而是在读取数据并显示它们时。关于 MySQL 中 Unicode 字符的问题,Stack Overflow 上有很多相关的问题和信息,你可以搜索一下,会找到大量的技巧和信息。

排序规则与字符集相关联,通过排序规则您也可以设置字符集。 - Your Common Sense
当“სახელი და გვარი”显示为“მიხეიე时,这绝对与排序无关,排序仅在比较字符串时才会考虑。 - nobody
排序规则基于字符集。如果没有设置utf8字符集,就不能使用utf8_general_ci排序规则。 - Your Common Sense
@Shrapnel:是的,排序规则是基于字符集的,但这里的问题是他正在插入一个字符集中的字符,而它们却显示在另一个字符集中。改变排序规则绝对不会有任何作用。问题很可能是php使用的客户端字符集不是utf8,导致字符被错误地转换和存储。 - gview

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接