MySQL 各种字符集配置的使用
Posted
技术标签:
【中文标题】MySQL 各种字符集配置的使用【英文标题】:Uses of various character set configs for MySQL 【发布时间】:2019-07-13 22:21:44 【问题描述】:我跑了
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 |
+--------------------------+-------------------+
谁能解释一下这些设置的具体用法?我的理解如下:
-
character_set_client:告诉客户端用于查询编码的编码
character_set_connection:服务器用于将查询转换为的编码
character_set_database:用于在表中存储数据的编码
character_set_server:如果未指定 character_set_connection,则默认编码
character_set_results:结果以这种格式编码并返回。
为什么需要这么多配置?客户端和服务器配置不能一直保持不变吗?
我正在尝试执行插入查询,但由于字符串中存在 ' 而失败。是否建议对其进行转义或对查询进行编码?另外,如何在golang中对其进行编码?
【问题讨论】:
网上有很多教程..你可以去探索一下。 您看到的错误与字符集无关。您可能只是有一个格式错误的查询。 这不是错误。我没有找到关于这些配置差异的好的文档。 【参考方案1】:是的,您必须对发送到 mysql 的任何字符串进行转义。特别是,至少必须对'
、"
和\
进行转义。否则,您认为将名称O'Brian
插入表中时会发生这种情况吗?:
INSERT INTO t (name) VALUES ('O'Brian');
引用和转义独立于character_set%
值。
一列可以有任何想要的CHARACTER SET
。
一个表可以有任何想要的默认CHARACTER SET
。
一个数据库可以有任何想要的默认CHARACTER SET
。注意:如果您在CREATEing
列或表时显式,则此设置无用。
服务器可以有任何想要的默认 CHARACTER SET
。注意:如果你明确CREATEing
databases/tables/columns,这个设置是没有用的。
同时,客户端可以有任何不同的CHARACTER SET
。但是告诉服务器客户端使用什么编码的方法是通过其中的 3 个设置(客户端/连接/结果)。可以通过
SET NAMES utf8mb4;
但是,在连接过程中通过一些参数来建立客户端的编码通常是“更好的”。 (这种语法因客户端而异——Java/php/VB/等)
为什么这么多?可能太多了。几乎所有实际案例都是通过更改这三个设置来处理的;同时,其他设置可以忽略。
还有一件事:存储例程具有字符集和排序规则,我认为这来自数据库设置。
【讨论】:
以上是关于MySQL 各种字符集配置的使用的主要内容,如果未能解决你的问题,请参考以下文章
mysql my.ini配置文件修改无效,修改mysql默认字符集