我可以将用户输入语言转换为数据库的默认排序规则吗?

时间:2019-02-07 15:08:59

标签: mysql collation

我想在数据库中搜索用户输入。数据库排序规则为latin1_swedish_ci。我不想更改它,我可以将用户输入的utf-8更改为latin1_swedish_ci吗?

编辑:
我有两种方法。
方法1:我导入并使用了默认排序规则latin1_swedish_ci和字符集latin1。那我有
 image

在这里,我可以像SELECT * FROM dict WHERE english_word = '$_value'一样进行查询,并根据需要在浏览器中获取包括malayalam_definition在内的所有列的值。但是问题是我无法像SELECT * FROM dict WHERE malayalam_definition = '$_value'这样查询。它不返回任何结果。

方法2:我将排序规则更改为utf8_unicode_ci,并将字符集更改为utf8。然后在mysql中获得所需的值,例如
image
在这里,当我像SELECT * FROM dict WHERE english_word = '$_value'在浏览器中查询 时,会在malayalam_definition值中查询到问号,例如
image

SHOW VARIABLES LIKE 'character\_set\_%';的结果

+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| character_set_client     | utf8   |
| character_set_connection | utf8   |
| character_set_database   | utf8   |
| character_set_filesystem | binary |
| character_set_results    | utf8   |
| character_set_server     | latin1 |
| character_set_system     | utf8   |
+--------------------------+--------+
7 rows in set (0.00 sec)

我需要更改character_set_server,然后怎么做?

1 个答案:

答案 0 :(得分:0)

首先,“数据库排序规则”仅是默认设置。真正的问题是您感兴趣的CHARACTER SET是什么。

然后,您的 client 中的字节是多少?它们被编码为latin1吗?还是utf8?无论哪种情况,请告诉MySQL即将发生的事情。优选地,这在连接参数中完成。 (您的客户端语言是什么?)或者,根据客户端编码使用SET NAMES latin1SET NAMES utf8

现在,MySQL将在INSERTSELECT上执行的操作...它将{em>将的编码从客户端的编码转换为列的编码,就像您执行{{ 1}}。无需采取进一步措施即可实现这一目标。

类似地,MySQL将在INSERT期间进行另一种转换。

(当然,如果列和客户端使用相同的编码,则无需“转换”。)

您的问题提到“归类”。到目前为止,我只谈论了SELECT,也称为“编码”。与此相反,两个字符串的排序和比较-这是CHARACTER SETs

对于COLLATION CHARACTER SET,默认latin1COLLATION
对于latin1_swedish_ci CHARACTER SET,默认utf8COLLATION
有几种不同的“排序规则”可以处理德语或土耳其语或西班牙语或(等)顺序的怪癖。

请说明为什么,您尝试按照自己的意愿去做。 错误有很多方法可以实现,所以我不想给您一个utf8_general_ci语句-这可能会使真实变得更糟目标。

最好使用utf8mb4而不是utf8。外界指的是ALTER;这等效于MySQL的UTF-8

编辑(在OP进行编辑之后)

第一个屏幕截图显示“ Mojibake”。另一个屏幕截图显示了问号。每个原因都在Trouble with UTF-8 characters; what I see is not what I stored

中进行了介绍