mysql insert 字符集_有关 MySQL 字符集的注意事项-爱可生

本文关键字:字符集、建库建表

e6c47133b55325e1b5021e099a694e43.png

一、数据库和字符集

1. 建库时指定

创建数据库时,显式指定字符集和排序规则,同时,当切换到当前数据库后,参数 character_set_database,collation_database 分别被覆盖为当前显式指定的字符集和排序规则。举个简单例子,创建数据库 ytt_new2,显式指定字符集为 latin1,同时排序规则为 latin1_bin。之后切换到数据库 ytt_new2 后,对应的系统参数也被修改。

mysql> create database ytt_new2 default character set latin1 collate latin1_bin;Query OK, 1 row affected (0.03 sec)mysql> use ytt_new2Database changedmysql>

select @@character_set_database, @@collation_database;+--------------------------+----------------------+| @@character_set_database | @@collation_database |+--------------------------+----------------------+| latin1 | latin1_bin |+--------------------------+----------------------+1 row in set (0.00 sec)

2. 改库时指定

改库类似建库,效果一样。但需要注意的一点是,修改库字符集与排序规则后,之前基于这个库创建的各种对象,还是沿用老的字符集与排序规则。

举个例子,对存储过程的影响:

-- 简单写个存储过程DELIMITER $$USE `ytt_new2`$$DROP PROCEDURE IF EXISTS `sp_demo`$$CREATE DEFINER=`root`@`%` PROCEDURE `sp_demo`( IN f1 VARCHAR(10), IN f2 VARCHAR(10) )BEGIN DECLARE v1 VARCHAR(20); SET v1 = CONCAT(f1,f2); SELECT v1 AS result; END$$DELIMITER ;

查看这个存储过程的字符集,这里看到排序规则是 latin1_bin,对应的字符集是 latin1,和数据库 ytt_new2 一致。

mysql> show create procedure sp_demo\G*************************** 1. row *************************** Procedure: sp_demo... Database Collation: latin1_bin1 row in set (0.00 sec)-- 那接下来改掉数据库的字符集为 UTF8mysql> alter database ytt_new2 character set utf8 collate utf8_general_ci;Query OK,

1 row affected, 2 warning (0.02 sec)mysql> select @@character_set_database, @@collation_database;+--------------------------+----------------------+| @@character_set_database | @@collation_database |+--------------------------+----------------------+| utf8 | utf8_general_ci |+--------------------------+----------------------+1 row in set (0.00 sec)-- 再查看存储过程 sp_demo 的字符集,还是之前的。

mysql> show create procedure sp_demo\G*************************** 1. row *************************** Procedure: sp_demo... Database Collation: latin1_bin1 row in set (0.00 sec)-- 此时,调用存储过程,字符集不对,报编码错误。

mysql> call sp_demo('我','你');ERROR 1366 (HY000): Incorrect string value: '\xE6\x88\x91' for column 'f1' at row 1-- 改变存储过程字符集只能删除重建,重新执行下之前的存储过程代码,再次调用,结果就正常了。

mysql> call sp_demo('我','你');+--------+| result |+--------+| 我你 |+--------+1 row in set (0.00 sec)Query OK, 0 rows affected, 2 warnings (0.01 sec)

3. 参数的指定

参数 character_set_database 和 collation_database 如果没有指定,默认继承服务器端对应参数 character_set_server 和 collation_server。

mysql> select @@character_set_server charset, @@collation_server collation -> union all -

> select @@character_set_database, @@collation_database;+---------+--------------------+| charset | collation |+---------+--------------------

+| utf8mb4 | utf8mb4_0900_ai_ci || utf8mb4 | utf8mb4_0900_ai_ci |+---------+--------------------+2 rows in set (0.00 sec)

那这种情况下,建库或者改库时不指定具体的字符集和排序规则,默认继承这两个参数:

mysql> show create database ytt_new3\G*************************** 1. row *************************** Database: ytt_new3Create Database: CREATE DATABASE `ytt_new3` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */1 row in set (0.00 sec)

二、表和字符集

1. 建表时指定(显式设置)

同建库一样,显式指定字符集和排序规则,优先级最高,以指定的值为准。

-- 创建新库 ytt_new4mysql> create database ytt_new4;Query OK, 1 row affected (0.02 sec)mysql> use ytt_new4;Database changed-- 创建新表 t1, 字符集 latin1, 排序规则 latin1_binmysql> create table t1(a1 int) charset latin1 collate latin1_bin;Query OK, 0 rows affected (0.05

sec)mysql> show create table t1\G*************************** 1. row *************************** Table: t1Create Table: CREATE TABLE `t1` ( `a1` int DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin1 row in set (0.00 sec)

2. 继承设置(隐式转换)

默认继承所属数据库级别的字符集和排序规则。这里需要注意的是所属数据库,不是当前数据库。

-- 当前数据库 ytt_new4.mysql> use ytt_new4;Database changed-- 表 t2 属于当前数据库 ytt_new4mysql> create table t2(a1 int);Query OK, 0 rows affected (0.05 sec)-- 查看表 t2 字符集和排序规则mysql> show create table t2\G*************************** 1. row *************************** Table: t2Create Table: CREATE TABLE `t2` ( `a1` int DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)--

创建表 t3,不过属于数据库 ytt_new5mysql> create database ytt_new5 character set gbk;Query OK, 1 row affected (0.03 sec)mysql> create table ytt_new5.t3 (id int);Query OK, 0 rows affected (0.04 sec)--

查看表 t3 字符集,和数据库 ytt_new5 一致mysql> show create table ytt_new5.t3\G*************************** 1. row *************************** Table: t3Create Table: CREATE TABLE `t3` ( `id` int DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=gbk1 row in set (0.01 sec)

3. 视图

视图其实就是虚拟的表,所以视图的字符集也划在表这块简单介绍下。视图的字符集完全依赖客户端的字符集设置。

比如:

mysql> set names gbk;Query OK, 0 rows affected (0.00 sec)-- 此时视图 v_t3 编码为 gbkmysql> create view v_t3 as select * from t3;Query OK, 0 rows affected (0.01 sec)mysql> set names gb18030;Query OK, 0 rows affected (0.00 sec)--

此时视图 v_t31 编码为 gb18030mysql> create view v_t3_1 as select * from t3;Query OK, 0 rows affected (0.01 sec)--

查看这两个视图的编码mysql> show create view v_t3\G*************************** 1. row *************************** View: v_t3 Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_t3` AS select `t3`.`a1` AS `a1` from `t3`character_set_client: gbkcollation_connection: gbk_chinese_ci1 row in set (0.01 sec)mysql> show create view v_t3_1\G*************************** 1. row ***************************

View: v_t3_1 Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_t3_1` AS select `t3`.`a1` AS `a1` from `t3`character_set_client: gb18030collation_connection: gb18030_chinese_ci1 row in set (0.00 sec)

4. 触发器

触发器基于表,所以触发器也归类到表这块。其实触发器的编码规则和视图一样。也是依赖客户端的设定。

比如一个简单的触发器:

-- 客户端编码为 utf8mysql> set names utf8;Query OK, 0 rows affected, 1 warning (0.00 sec)-- 触发器的编码也继承同样的客户端编码mysql> create trigger tr_after_insert_t3 after insert on t3 for each row insert into t4 values(new.a1);

Query OK, 0 rows affected (0.01 sec)mysql> show create trigger tr_after_insert_t3\G*************************** 1. row *************************** Trigger: tr_after_insert_t3 sql_mode:SQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER `tr_after_insert_t3` AFTER INSERT ON `t3` FOR EACH ROW insert into t4 values(new.a1)

character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8mb4_0900_ai_ci Created: 2020-03-09 11:32:23.941 row in set (0.00 sec)

三、列和字符集

1. 显式指定

同数据库和表一样,列也可以指定特定的字符集和排序规则。虽说是可以这样做,但是非常不推荐,最主要原因是每个列字符集不一样,导致写入和检索都得额外的编写 SQL。

-- 创建新库 ytt_new6mysql> create database ytt_new6 character set latin1;Query OK, 1 row affected (0.02 sec)mysql> use ytt_new6;Database changed-- 在 ytt_new6 下创建表 t1,拥有字段 a1,a2,a3 分别给定不同的字符集和排序规则mysql> create table t1( a1 char(10) charset latin1 collate latin1_bin, a2 char(10) charset gbk collate gbk_bin, a3 char(10) charset utf8mb4 collate utf8mb4_bin);Query OK, 0 rows affected (0.05 sec)mysql> show create table t1\G*************************** 1. row ***************************

Table: t1Create Table: CREATE TABLE `t1` ( `a1` char(10) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, `a2` char(10) CHARACTER SET gbk COLLATE gbk_bin DEFAULT NULL, `a3` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin11 row in set (0.00 sec)

那接下来简单插入一条记录,需要为每列添加 introduer,否则报错。

-- 没有显式指定每列字符集,报错mysql> insert into t1 values ('character ','字符集合','字符集合');ERROR 1366 (HY000): Incorrect string value: '\xAC\xA6\xE9\x9B\x86\xE5...' for column 'a2' at row 1-- 为每列显式添加 Introducermysql> insert into t1 values (_latin1 'character ',_gbk '字符集合',_utf8mb4 '字符集合');Query OK, 1 row affected (0.01 sec)

查询出来最麻烦,因为每次查询出来的结果只能有一个字符集,字符集兼容的列可以一起检索;不兼容的列得分开检索。举个例子,我想简单的 SELECT * 拿出所有记录,结果发现有一个字段据显示不正常。

mysql> select * from t1;+-----------+------------------+--------------+| a1 | a2 | a3 |+-----------+------------------+--------------+| character | 瀛?闆 | 字符集合 |+-----------+------------------+--------------+1 row in set (0.00 sec)

所以针对这种情形,该怎么检索数据呢?必须得对单个字段检索或者是对兼容的列一起检索。

-- 以字符集 GBK 输出列 a1 a2,由于 a1 是保存的是字母,所以兼容输出。mysql> set names gbk;Query OK, 0 rows affected (0.00 sec)mysql> select a1,a2 from t1;+-----------+--------------+| a1 | a2 |+-----------+--------------+| character | 字符集合 |+-----------+--------------+1 row in set (0.00 sec)-- 以字符集utf8mb4和gbk不兼容,得单独输出列a3。或者单独输出a2.mysql> set names utf8mb4;Query OK, 0 rows affected (0.00 sec)mysql> select a3 from t1;+--------------+| a3 |+--------------+| 字符集合 |+--------------+1 row in set (0.00 sec)

2. 隐式转换

这种方式,是最推荐的,也是最长的方式,所有列继承表的字符集,不单独指定。

-- 建表 t2,指定字符集为 gbk.mysql> create table t2(a1 varchar(10),a2 varchar(10)) charset gbk;Query OK, 0 rows affected (0.05 sec)mysql> show create table t2\G*************************** 1. row *************************** Table: t2Create Table: CREATE TABLE `t2` ( `a1` varchar(10) DEFAULT NULL, `a2` varchar(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=gbk1 row in set (0.01 sec)

但是这里有一个需要注意的点,如果此时对表进行字符集变更,那表的列依然保留原来的字符集。

例如:

mysql> alter table t2 charset utf8;Query OK, 0 rows affected, 1 warning (0.01 sec)Records: 0 Duplicates: 0 Warnings: 1mysql> show create table t2\G*************************** 1. row ***************************

Table: t2Create Table: CREATE TABLE `t2` ( `a1` varchar(10) CHARACTER SET gbk DEFAULT NULL, `a2` varchar(10) CHARACTER SET gbk DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)

如果想把表里字段的字符集也改了,应该用以下语句更改表字符集。

mysql> alter table t2 convert to character set utf8;Query OK, 0 rows affected, 1 warning (0.09 sec)Records: 0 Duplicates: 0 Warnings: 1mysql> show create table t2\G*************************** 1. row ***************************

Table: t2Create Table: CREATE TABLE `t2` ( `a1` varchar(10) DEFAULT NULL, `a2` varchar(10) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf81 row in set (0.00 sec)

那到这儿,我们已经了解了字符集对数据库,表以及列的使用以及相关影响。

大致总结下,这篇我详细介绍了字符集在 MySQL 数据库,表以及列相关对象处理时的注意事项,并且举例说明。希望对大家有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#发送讯息_企业讯息

c#发送讯息本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转换器和适…

mysql触发器中case语句_一个很好的触发器例子(case when)

CREATE OR REPLACE TRIGGER TR_CGD1BEFORE UPDATE OR INSERT OR DELETE ON BB_MJ_CGD1_TBFOR EACH ROWDECLAREV_COUNT NUMBER;BEGINCASEWHEN UPDATING OR INSERTING THENIF :NEW.DJZT 结束 THEN:NEW.DJZT : 结束;ELSESELECT COUNT(*)INTO V_COUNTFROM BB_MJ_KCRKD2_TB RKD2WHE…

java cr_WildFly 10 CR 2发布– Java EE 7,Java 8,Hibernate 5,JavaScript支持热重载

java cr昨天,WildFly团队发布了最新版本的WildFly 10 。 CR2很可能是预计于十月份发布最终版本之前的最后一个版本。 即使主要支持的Java EE规范是7,WildFly 8和WildFly 9也提供了许多新功能,而WildFly 9和WildFly 9现在制作了三个服务器版本…

python位置参数ppt_如何在Python中使用一个或多个相同的位置参数?

介绍..如果我们正在编写一个对两个数字执行算术运算的程序,则可以将它们定义为两个位置参数。但是由于它们是相同种类的/ python数据类型的参数,因此使用nargs选项告诉argparse您确实需要两种相同的类型可能更有意义。怎么做..1.让我们编写一个程序来减去…

java设计模式教程_Java设计模式教程

java设计模式教程课程大纲 架构和计算机科学中的设计模式是记录特定专业领域中设计问题的解决方案的正式方法。 这个想法是由建筑师Christopher Alexander在建筑领域引入的,并已被修改为包括计算机科学在内的其他各个学科。 设计模式是针对软件设计中给定上下文中常…

python剑指offer面试题_剑指Offer(Python语言)面试题38

面试题38:字符串的排列题目:输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca和cba。# -*- coding:utf-8 -*-class Solution:def Permutation(se…

侬娜·杰尔_杰尔·地狱

侬娜杰尔什么是JAR地狱? (或者是classpath地狱?还是依赖地狱?)在考虑使用Maven或OSGi等现代开发工具时,哪些方面仍然有意义? 有趣的是,似乎没有对这些问题的结构化答案(…

cmake 安装mysql5.6_CMAKE安装MYSQL 5.6.10

mysql5.6.10不支持configure安装了,提供了CMAKE安装方式 #sudo groupadd mysql #sudo useradd mysql -g mysql #sudo mkdir -p /home/mysql/data #sudo mkdir /usr/local/mysql #sudo mkdir /var/log/mysql #sudo chown -R mysql:mysql /home/mysql/data #sudo cho…

java 多线程变量可见性_Java多线程:易变变量,事前关联和内存一致性

java 多线程变量可见性什么是volatile变量? volatile是Java中的关键字。 您不能将其用作变量或方法名称。 期。 我们什么时候应该使用它? 哈哈,对不起,没办法。 当我们在多线程环境中与多个线程共享变量时,通常使用v…

Mysql运行在内核空间_思考mysql内核之初级系列6—innodb文件管理 | 学步园

在上一篇里面,bingxi和alex思考了information_schema,这个一直在innodb外围打转。没有进入到innodb的内部。在后续的文章中,以innodb的为主,逐个思考。Bingxi和alex今天了解了fil文件管理。对应的文件为:D:/mysql-5.1.…

pcl_openmap_OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

pcl_openmap1.简介 在第一个教程中,我们创建了一个基本的OpenMap GIS应用程序,该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中,我们使用了以下OpenM…

mysql7.5安装教程_CentOS7.5下yum安装MySQL8图文教程

卸载MariaDB1.列出所有安装的MariaDB rpm 包rpm -qa | grep mariadb2.强制卸载rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64安装MySQL1. 环境CentOS7.52. 获取MySQL最新版 rpm包yum仓库下载MySQLyum localinstall https://repo.mysql.com//mysql80-community-release-e…

字符串url获取参数_如何从URL查询字符串获取示例参数或将其附加到URL查询字符串(示例)?...

字符串url获取参数让我们剖析几个简单的用例,并查看视图参数的工作原理(视图参数名称不是强制性的,以匹配通过URL查询字符串传递的请求参数,但在本文中,我们将重点讨论这种情况): 情况1 在inde…

mysql和sqlserver分页的区别_关于SQLServer和MySQL 查询分页语句区别

首先来定义几个要用到的参数(例子)t_user数据表int currentPage ; //当前页int pageRecord ; //每页显示记录数关于SqlServer数据库分页SQL语句为:String sql "select top "pageRecord " * from t_user where id not in (select top "(currentPage-1)*pag…

java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话

java 微型数据库用肉眼看,基准测试似乎只是确定执行某些代码需要花费多长时间的简单问题。 但是,通常情况下,这是幼稚的方法。 提供具有准确和可重复结果的有意义的基准并非易事。 在本文中,我们将向您介绍OpenJDK代码工具项目&a…

mysql快速随机_MySQL随机取数据最高效的方法

mysql随机取数据最高效率的方法发现在SQL语句里有一个 ORDER BY rand() 这样的一个语句,这个说是用着方便,但是效率实在是太低了,于是我用了以下的方法来优化,就是用JOIN表的方法来达到这个取随机数据行的方法,你可以用…

部署被测软件应用和中间件_使用FlexDeploy对融合中间件应用程序进行自动化软件测试...

部署被测软件应用和中间件自动化软件测试是任何软件组织都必须执行的强制性活动之一,以保证其产品质量。 但是,此过程通常变得相当复杂,尤其是涉及由多个不同部分组成的现代复杂系统的自动化测试时。 所有这些部分都基于不同的技术&#xff0…

python batch_size_python 實現動態 batch size,多張圖片如何堆疊轉成指針

前陣子有發問,關於 python 動態 batch size 如何實現,目前解決之前問題現在遇到的問題是當我把兩張圖片直接用 numpy concat 堆疊在一起 進行 acl.util.numpy_to_ptr 轉換成指針進行推理後,得到的結果只有第一張圖片是對的,第二張…

投行数据_投行对Java的二十大核心访谈问答

投行数据这是在金融领域(主要是在大型投资银行)共享Java核心访谈问题和答案的新系列。 在JP Morgan,Morgan Stanley,Barclays或Goldman Sachs上会问许多这些Java面试问题。 银行主要从多线程 , 集合 ,序列化…

php中mysql_fetch_row_php中的mysql_fetch_row,mysql_fetch_array,mysql_fetch_object

1.mysql_fetch_rowmysql_fetch_row,这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果的列储存在一个数组的单元中,偏移量从 0 开始。 注意,这里是从0开始偏移&…