-1

我跑了

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 输出是

+--------------------------+-------------------+
| Variable_name            | Value             |
+--------------------------+-------------------+
| character_set_client     | utf8              |
| character_set_connection | utf8              |
| character_set_database   | latin1            |
| character_set_filesystem | binary            |
| character_set_results    | utf8              |
| character_set_server     | latin1            |
| character_set_system     | utf8              |
| collation_connection     | utf8_general_ci   |
| collation_database       | latin1_swedish_ci |
| collation_server         | latin1_swedish_ci |
+--------------------------+-------------------+

有人可以解释这些设置的确切用法吗?我的理解如下:

  1. character_set_client:告诉客户端用于查询编码的编码
  2. character_set_connection:服务器用于将查询转换为的编码
  3. character_set_database:用于在表中存储数据的编码
  4. character_set_server:如果未指定 character_set_connection,则默认编码
  5. character_set_results:结果以这种格式编码并返回。

为什么需要这么多配置?客户端和服务器配置不能始终保持相同吗?

我正在尝试执行由于字符串中存在 ' 而失败的插入查询。是否建议对其进行转义或对查询进行编码?另外,如何在golang中对其进行编码?

4

1 回答 1

1

是的,您必须转义任何发送到 MySQL 的字符串。特别是,至少, ', ", and\必须被转义。否则,您认为在将名称O'Brian插入表时会发生这种情况吗?:

 INSERT INTO t (name) VALUES ('O'Brian');

引用和转义与character_set%值无关。

一列可以有任何需要CHARACTER SET的 .
一个表可以有任何需要的默认值 CHARACTER SET
数据库可以有任何所需的默认值 CHARACTER SET。注意:如果你明确当CREATEing列或表时,这个设置是没有用的。
服务器可以有任何所需的默认值 CHARACTER SETCREATEing注意:如果您在数据库/表/列时显式,则此设置无用。

同时,客户端可以有任何不同的CHARACTER SET. 但是告诉服务器客户端有什么编码的方法是通过其中的 3 个设置(客户端/连接/结果)。可以通过

SET NAMES utf8mb4;

但是,在连接过程中通过一些参数来建立客户端的编码通常是“更好的”。(这种语法因客户端而异——Java/PHP/VB/等)

为什么这么多?可能太多了。几乎所有实际案例都是通过更改这三个设置来处理的;同时,其他设置可以忽略。

还有一件事:存储的例程有一个字符集和排序规则,我认为这来自数据库设置。

于 2019-03-05T16:39:01.600 回答