财政局网站建设方案,app推广联盟,山东天元集团有限公司,网站怎么拿百度收入mysql涉及到各种字符集#xff0c;在此做一个总结。 字符集的设置是通过环境变量来设置的#xff0c;环境变量和linux中的环境变量是一个意思。mysql的环境变量分为两种#xff1a;session和global。session变量是仅在这次会话红中有效#xff0c;在mysql中#xff0c;一次…mysql涉及到各种字符集在此做一个总结。 字符集的设置是通过环境变量来设置的环境变量和linux中的环境变量是一个意思。mysql的环境变量分为两种session和global。session变量是仅在这次会话红中有效在mysql中一次会话可以理解为当前连接除非reload,否则一次会话就只有一次连接。global环境变量则是确定了下一个新建立的session的变量值。使用show variables可以查看session值如果要查看global的环境变量则用show golbal variables语句。设置session环境变量用set variablenamevalue,设置global环境变量用set global variablenamevalue。 环境变量可以在服务启动后用set来设置有些主要是和数据库服务器有关的也可以在启动服务时用命令行参数指定还可以在配置文件中设置my.cnf。 mysql提供了四个等级的默认字符集以及比较规则分别是服务器、数据库、表、列级别的。文档原话是There are default settings for character sets and collations at four levels: server, database, table, and column. The description in the following sections may appear complex, but it has been found in practice that multiple-level defaulting leads to natural and obvious results. 一个字符集character set对应了一个默认的字符排序码规则collation,当改变了一个等级的默认编码集时与它同等级的默认字符排序规则也会变成该字符集对应的字符排序规则。 除了有这四个等级的默认字符编码和排序规则还可以指定具体某一段字符的编码以及他的排序规则指定字符编码是直接在他前面加上_utf8就可以了指定排序规则在后面加上collate排序规则如下这样 SELECT _utf8abc COLLATE utf8_danish_ci; 注意如果有转义字符那么转义字符是不会收字符串指定编码集影像的而是和character_set_connection一致如下 1 mysql SET NAMES latin1;
2 mysql SELECT HEX(à\n), HEX(_sjisà\n); 返回的结果中\n仍然是换行符因为\用的是latin1的字符集在latin1中它是换行符而_sijis字符集中\不是转移字符而是6E。 结果 -----------------------------
| HEX(à\n) | HEX(_sjisà\n) |
-----------------------------
| E00A | E00A |
----------------------------- 如果要查看所有的字符集用show character set语句查看所有的collation用show collation语句。 字符集的设定不仅影响着存储还会影响客户端和数据库服务器的通信关于数据编码mqsql中涉及到下面几个问题 1、客户端发过来的数据使用什么字符集编码的 2、接收到数据之后应该用什么编码格式编码之后再将数据插入到mysql server中 3、执行查询之后查询出来的结果应该用什么编码集编码之后再返回 4、数据库的各种表的数据应该用什么字符集编码以及它们用什么排序 5.查询语句的字符串比较时应该在哪一个标准里面来比较比如Mueller Müller是为真还是假 6.数据库的各种元数据包括表名、数据库名、密码、用户名、以及comment等用什么字符集表示 针对这四个问题mysql就提供了不同的环境变量来进行跟踪这些变量为 变量名 含义 character_set_server 默认的内部操作字符集 character_set_client 客户端来源数据使用的字符集也就是客户端发过来的查询语句使用的什么字符集 character_set_connection MySQL接受到用户查询后按照character_set_client将其转化为character_set_connection设定的字符集。 character_set_results 查询结果编码的字符集 character_set_database 当前选中数据库的默认字符集 character_set_system 系统元数据(字段名等)字符集 collation_connection 执行字符比较时采用的编码规则 在mysql中可以为数据库指定默认的字符编码成为该数据库中每个新建表的默认字符编码集但是对于已经建立的表则不受影响。在新建一个表时也可以使用DEFUALT CHARACTER SETxxx来指定表的字符编码。 在数据库的查询select update insert操作中涉及到的字符编码有character_set_client, character_set_connnection, character_set_result三个变量这是三个变量是需要建立连接之后进行设置的. 1、针对第一个问题使用character_set_client环境变量来回答 character_set_client 这是用户告诉服务器客户端发过来的SQL语句是用的什么字符集要和客户端发出去的字节流采用的编码集一致如果是shell那么就是和shell的编码集一致中文windows的cmd就是gbk。但是对于使用_utf8xxx标记的字符则用标记的字符集解码。 2、针对第二个问题使用character_set_connetion环境变量来回答 character_set_connection MySQL server 接收到用户查询后按照character_set_client将其转化为character_set_connection设定的字符集一般就是所操作的表对应的编码集。 3、针对第三个问题使用character_set_result环境变量来回答character_set_results MySQL将存储的数据转换成character_set_results中设定的字符集发送给用户客户端获取到的结果就是以这种形式编码的。 4.针对第四个问题使用上面提到的四个等级的默认字符集以及排序规则即character_set_server、character_set_database以及建立表时的DEFAULT CHARACTER SETxxx和指定字段时的DEFAULT CHARACTER SETxxx来回答 character_set_server决定了服务器的默认编码character_set_database决定了新建数据库的默认字符集而数据库的字符集又决定了新建表的默认字符集而表的字符集又决定了字段的默认字符集如果没有通过DEFAULT CHARACTER SETxxx来改变表的字符集则新表就使用character_set_database指定的字符集。 5.针对第五个问题使用collation_connection来回答 collation_connection变量制定了比较的规则。collation_connection的值得形式如下字符集_语言_ci大小不写敏感 或字符集_语言_cs大小写敏感像中文这样的没有大小写所以只能是ci比如set collatioin_connectiongbk_chinese_ci。就是设置成中文字典的排序规则。除了按具体语言排序还可以按照二进制的位置排序比如utf8_bin。 character_set_connection和collatioin_connection是一体的设置了character_set_connection之后collation_connection会跟着变成对应的默认排序规则反之亦然。如果要显示的设置排序规则可以用 SET NAMES charset_name COLLATE collation_name 。 但是如果查询语句的字符串和表的字段比较则collation_connection不适用因为表的字段有它自己的字符排序规则而它自己的排序规则优先级高于collation_connection。 6.针对第六个问题使用character_set_system来回答 character_set_system表示元数据的字符集默认就是utf8而且不要去更改它否则因为类似于用户名密码这种东西可能用各种奇葩的字符去表示只有utf8能够容纳它们。如果变成了别的字符集那么用户名和密码就不能用你想要的字符去表示了。需要注意的是这个character_set_system也好character_set_dababase、character_set_server也好都指标是在数据库内部的保存格式而不是返回到客户端的编码格式返回到客户端的结果都会转化为character_set_results指定的字符集之后再返回官方文档原话是“Storage of metadata using Unicode does not mean that the server returns headers of columns and the results of DESCRIBE functions in the character_set_system character set by default. When you use SELECT column1 FROM t, the name column1 itself is returned from the server to the client in the character set determined by the value of the character_set_results system variable, which has a default value of latin1.”。 另外如果要临时设置返回值的编码可以用set names charset_name来临时改变character_set_results以及其他相关变量的值为charset_name。set names charset_name等价于下面三条语句的结合 1 SET character_set_client charset_name;
2 SET character_set_results charset_name;
3 SET character_set_connection charset_name; SET CHARACTER SET和 SET NAMES 很像但是是把 character_set_connection 和 collation_connection 分别设置为 character_set_database 和 collation_database一样SET CHARACTER SET charset_name 等同于以下三条语句的结合。 1 SET character_set_client charset_name;
2 SET character_set_results charset_name;
3 SET collation_connection collation_database; 所以set character set charset_name要更常用。 顺便提一句mysql的错误日志意识utf8格式产生的但是如果把它输出到客户端它就会转场character_set_results的编码格式再传到客户端所有传到客户端的东西都会转码成character_set_results的。 还可以加入启动参数skip-character-set-client-handshake来使客户端的编码和数据库保持一致。 通常客户端的字符集可以通过操作系统来获取从而使得字符集的分配和客户端一致。 参考1、Connection Character Sets and Collations 2、UTF-8 for Metadata 3、What are character sets and collations 4、MySql:charset和collation的设置 5、Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结 转载于:https://www.cnblogs.com/JMLiu/p/8313204.html