我学的是毕业后 互联网 找工作这一块,以后毕业了该找个什么工作

全栈 - 11 数据库 MySQL 使用方法 - 推酷
全栈 - 11 数据库 MySQL 使用方法
这是 全栈数据工程师养成攻略 系列教程的第十一期:11 数据库 MySQL使用方法。
我们已经掌握了如何用MAMP或WAMP在个人电脑上搭建Web环境,其中包含了用于存储数据的关系型数据库MySQL,现在就让我们来了解下如何使用MySQL。
MySQL中可以存在多个数据库(Database),每个数据库对应一个相对独立的项目。一个数据库中可以包含多个数据表(Table),不同的数据表用来存储不同用途的数据。举例来说,可以新建一个 chat 数据库用于存储和某一社交网站相关的数据,里面有 user 和 message 两个表,分别用来存储用户基本信息、用户之间的聊天记录。需要注意的是,数据库名和数据表名最好都使用英文名称。
数据表和Excel中的表格很类似,既有行也有列,即我们之前提及的二维表结构。以 user 表为例,每一行记录了一名用户的基本信息,每一列即用户信息的一个字段,例如姓名、性别、职业等。
MySQL涉及的操作包括新建或删除数据库,以及在一个已有的数据库中新建、清空或删除数据表。除此之外,主要就是在一个已有的数据表中对数据进行CURD操作,即 Create 、 Update 、 Read 、 Delete ,分别对应插入数据、更新数据、读取数据、删除数据。接下来我们将了解,如何使用命令行、Web工具、本地软件、Python代码四种方法,来操作MySQL数据库。
可以在命令行中输入以下命令,按回车后再输入MySQL数据库的密码,即可进入MySQL提供的交互命令行,类似Python的交互编程环境,每敲一行MySQL语句,按回车即可执行。这种方法仅适用于单独安装MySQL数据库,不适用于MAMP或WAMP,而且对代码能力要求较高,故不推荐使用。
mysql -u root -p
Web工具是指在MySQL内核之上,基于Web开发出的图形化操作界面。只要在网站上点一点,即可完成对MySQL的各类操作。其中最为常用的一种即phpMyAdmin,基于PHP开发,简单、轻量、好用,在MAMP或WAMP中也会自带phpMyAdmin。
在MAMP的欢迎页面上可以找到使用phpMyAdmin管理MySQL的链接,点击后将看到以下界面,左侧中所显示的是当前已存在的数据库,右侧中则显示了菜单栏和对应的内容。
首先让我们来尝试下如何新建数据库。默认情况下会存在三个数据库, information_schema 、 mysql 和 performance_schema ,这三个数据库是MySQL自带的,不要去动它们。点击左侧中的 New ,或者右侧菜单栏中的 Databases ,都可以在右侧中看到当前已存在数据库的一些基本信息,以及进行数据库新建操作。
输入新建数据库的名称,推荐使用全英文。这里我们输入 douban ,因为需要将之前爬取的豆瓣电影数据存入数据库中。选择 Collation 为 utf8_general_ci ,然后点击 Create 即可。
新建好数据库后,由于数据库为空,会自动跳到新建数据表的页面。给数据表取个英文名,这里输入 movie ,然后选择表的列数,默认为4,点击 Go 进入下一步。即使数据表最终不是4列也没关系,多的列会自动忽略,列数不够同样可以继续加,所以不用担心。
接下来需要配置每一列的详细内容,包括Name、Type、Length/Values、Default、Collation、Attributes、Null、Index、A_I、Comments。我们首先填写第一个字段,每个数据表都需要一个主键即id,不同的行具有唯一不同的id,用于进行彼此区分。
Name:字段的名称,纯英文,让我们输入 id ;
Type:字段的变量类型,id应当是正整数,所以使用默认的 INT 即可;
Length/Values:字段的长度,不填的话会使用默认值,即 INT 类型的默认长度;
Default:插入数据时如果不提供值,字段的默认值,这里可以先不管;
Collation:不填的话则使用数据库的Collation,否则覆盖,这里可以先不管;
Attributes:字段的属性,这里可以先不管;
Null:字段是否默认为空值,默认不勾选;
Index:字段使用何种索引,这里选择 PRIMARY ,即主键,如果有弹窗则点击 Go 即可;
A_I:是否自增,Auto Increasement,即在插入数据时如果不提供值,会自动增加,第一条记录为1,第二条记录为2,以此类推。这里需要勾上,因为我们希望id是自增的,从而不同记录使用不同的id;
Comments:字段的备注信息,可以留空不管。
接下来再填一下电影的标题字段,Name输入 title ,Type选为 VARCHAR ,Length/Values输入 255 ,因为255个字符对于标题而言足够了,其他选项不用管。Type的可选值包括数值类Numeric、日期时间类Date and time、文本类String、空间类Spatial四大类,以上所使用的 VARCHAR 是一种长度可变的字符串,使用时需要设置最大长度。如果需要存储更长的文本,可以考虑 TEXT 、 MEDIUMTEXT 、 LONGTEXT 等。
同理,继续填写电影的链接字段,填入 url 、 VARCHAR 和 255 ;对于电影的简介字段,由于电影简介可能会很长,所以Name输入 summary ,Type选择 TEXT ;至于电影的评分字段,由于评分可以是小数,所以Name输入 score ,Type选择Numeric类中的 FLOAT 。如果需要继续增加字段,输入需要增加的列数并点击 Go ,然后根据字段特征完善Name、Type和Length/Values即可。
字段信息全部填写完毕后,点击右下方的 Save 即可完成数据表的新建,左侧中会选中刚才新建的数据库和数据表,右侧中会出现新的菜单栏。点击 Browse 可以查看数据表内的数据记录,点击 Structure 可以查看数据表的结构,即各项字段的配置内容,点击 SQL 可以在当前数据表上执行SQL命令,点击 Insert 可以向当前数据表中插入数据记录,点击 Export 和 Import 分别可以导出和导入数据表,点击 Operations 可以进一步执行清空数据表和删除数据表等操作。
在上图所示的 Structure 标签页中,可以查看数据表的结构,即各项字段的详细配置,并对某个字段执行修改 Change 、删除 Drop 等操作。除此之外,还可以向数据表中添加若干列,以及查看数据表的空间存储情况。
如果在左侧点击某一数据库,则右侧的菜单栏相应地会变成数据库级别的操作,如查看数据库的结构,即各个数据表的基本信息,在当前数据库上执行SQL命令,导出和导入数据库,执行删除数据库等操作。
细心的话可以发现,每次在phpMyAdmin上执行相关操作之后,右侧菜单栏下都会出现相应的SQL命令,说明phpMyAdmin都是将我们的点击操作转换成了相应的SQL命令,然后交与MySQL执行。
让我们尝试下向 movie 表中插入数据。在左侧中点击 douban 数据库中的 movie 表,选择右侧菜单栏中的 Insert ,依次在title、url、summary、score的Value中填写对应的值,id留空。如果需要同时插入两条数据,则取消勾选 ignore 并填写第二条数据的对应值。如果需要同时插入更多数据,则在底部的 Continue insertion with 后选择相应的行数,并依次填写相关数据。数据全部填写完毕后,点击页面下方的 Go ,即可进行数据插入操作,在菜单栏下也可以看到对应 INSERT 命令。之后再点击 Browse ,即可查看刚插入的数据。
总而言之,phpMyAdmin是一款简单轻量好用的Web工具,它提供的功能虽然有限,但都是管理MySQL所需的最为核心的功能,因此更容易上手,不会因为功能太多反而导致眼花缭乱。
相对于phpMyAdmin等Web工具,本地数据管理软件连接更稳定、功能更强大,例如 Navicat Premium ,Mac OS版本的软件界面如下图所示。
Navicat支持MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB等多种数据库,在数据库和数据表之上还有数据连接(Connection)这一概念,因为Navicat可以记录并连接多个主机上的数据库,而phpMyAdmin作为一种Web工具仅能连接本地数据库。
让我们来尝试新建一个连接。点击左上角的Connection,选择MySQL,在弹出的对话框中依次填入连接名称、主机地址、端口、用户名、密码等信息,其中基于MAMP安装的MySQL主机地址即为 localhost ,点击 OK 即可新建一个连接。当然,新建连接时还可以涉及到更多配置内容,这里就不展开讲了。
新建连接后,在Navicat软件界面的左侧即可看到当前已存在的全部连接,双击连接名称即可查看连接下存在的数据库,双击数据库名称即可建立数据连接,并查看数据库下存在的数据表。在连接名、数据库名、数据表名上右键,都会出现一系列可执行的操作,例如在数据库名和数据表名的右键菜单里,都有 Execute SQL File 和 Dump SQL File 两项,分别对应数据库级别和数据表级别的导入和导出操作。
总的来说,Navicat功能更强大,使用门槛也更高,毕竟可点击的按钮、可配置的选项、可执行的操作都远远更多。我个人的习惯是,使用phpMyAdmin完成新建数据库、新建数据表、定义表字段等操作,因为phpMyAdmin简单轻量,但又足以完成这些任务;使用Python代码对数据表进行CURD操作,因为项目中涉及的数据记录可能非常多,所以用Python代码处理自然是最高效和灵活的选择;当需要导入导出大量数据,或者导入导出需要对涉及字段进行灵活配置时,则使用Navicat完成复杂的导入导出任务。
所以,我首先在本机上编程并将数据库和数据表整理好,在本地Web环境上实现Web项目和数据库的交互,然后将数据库导出并导入到云端服务器上的MySQL,最后将Web项目也部署到服务器上,即可完成一次数据项目的开发。
至于如何使用Python来操纵MySQL数据库,将在下一节中进行讲解。
视频链接:
如果觉得文章不错,不妨点一下左下方的喜欢~
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(41289)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'mysql创建数据库指定字符集',
blogAbstract:'mysql 创建 数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题。
我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来 很多mysql数据库工具(除了phpmyadmin,我偶尔用,功能强速度慢)都不支持创建时指定数据库编码,当然可以改my.ini来解决这个问题,但是需要重新启动mysql,不过用下面的语句会更有效
GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_
UTF8: CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:9,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:2,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}PHP获取mysql数据表的字段名称和详细信息的方法
来源:易贤网&& 阅读:2551 次&&日期:
温馨提示:易贤网小编为您整理了“PHP获取mysql数据表的字段名称和详细信息的方法”,方便广大网友查阅!
首先我们需要了解下查询MySQL数据库/表相关信息的SQL语句:
SHOW DATABASES //列出 MySQL Server 数据库。
SHOW TABLES [FROM db_name] //列出数据库数据表。
SHOW CREATE TABLES tbl_name //导出数据表结构。
SHOW TABLE STATUS [FROM db_name] //列出数据表及表状态信息。
SHOW COLUMNS FROM tbl_name [FROM db_name] //列出资料表字段
SHOW FIELDS FROM tbl_name [FROM db_name],DESCRIBE tbl_name [col_name]。
SHOW FULL COLUMNS FROM tbl_name [FROM db_name]//列出字段及详情
SHOW FULL FIELDS FROM tbl_name [FROM db_name] //列出字段完整属性
SHOW INDEX FROM tbl_name [FROM db_name] //列出表索引。
SHOW STATUS //列出 DB Server 状态。
SHOW VARIABLES //列出 MySQL 系统环境变量。
SHOW PROCESSLIST //列出执行命令。
SHOW GRANTS FOR user //列出某用户权限
由上述SQL语句可以看到,我们可以使用SHOW FULL COLUMNS来列出字段及详情信息,示例代码:
$rescolumns = mysql_query("SHOW FULL COLUMNS FROM ".TB_NAME."") ;
while($row = mysql_fetch_array($rescolumns)){
// echo '字段名称:'.$row['Field'].'-数据类型:'.$row['Type'].'-注释:'.$row['Comment'];
// echo '&br/&&br/&';
print_r($row);
打印结果:
Array ( [0] =& id [Field] =& id [1] =& char(2) [Type] =& char(2) [2] =& utf8_general_ci [Collation] =& utf8_general_ci [3] =& NO [Null] =& NO [4] =& PRI [Key] =& PRI [5] =& [Default] =& [6] =& [Extra] =& [7] =& select,insert,update,references [Privileges] =& select,insert,update,references [8] =& [Comment] =& )
Array ( [0] =& title [Field] =& title [1] =& char(50) [Type] =& char(50) [2] =& utf8_general_ci [Collation] =& utf8_general_ci [3] =& YES [Null] =& YES [4] =& [Key] =& [5] =& [Default] =& [6] =& [Extra] =& [7] =& select,insert,update,references [Privileges] =& select,insert,update,references [8] =& 建议存储:标题、姓名等信息 [Comment] =& 建议存储:标题、姓名等信息 )
Array ( [0] =& des [Field] =& des [1] =& varchar(255) [Type] =& varchar(255) [2] =& utf8_general_ci [Collation] =& utf8_general_ci [3] =& YES [Null] =& YES [4] =& [Key] =& [5] =& [Default] =& [6] =& [Extra] =& [7] =& select,insert,update,references [Privileges] =& select,insert,update,references [8] =& [Comment] =& )
补充说明信息:
当然你也可以通过mysql_list_fields — 列出 MySQL 结果中的字段。mysql_list_fields() 取得给定表名的信息,参数是数据库名和表名,返回一个结果指针。
但是,mysql_list_fields() 函数已过时。最好用 mysql_query() 来发出一条 SHOW COLUMNS FROM table [LIKE 'name'] 的 SQL 语句来代替。详细可参考PHP帮助文档:PHP: mysql_list_fields - Manua
更多信息请查看
更多信息请查看
【】&&&&&【点此处查询各地各类考试咨询QQ号码及交流群】
易贤网手机网站地址:
由于各方面情况的不断调整与变化,易贤网提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
相关阅读 & & &
如一个数据表table里面有5个字段:id,name,title,content,rank。我想查找字段name(不包括name字段)之后的所以字段的SQL语句应该怎样写?查找出来的结果应该是:title,content,rank 这是三个字段。有没有其他办法实现这个功能?
& (斌starin
&nbsp&nbsp&nbsp &nbsp&nbsp&nbsp会员注册
本站不参与评论!()
自觉遵守:爱国、守法、自律、真实、文明的原则
尊重网上道德,遵守中华人民共和国各项有关法律法规
严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的评论
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
您在本站发表的评论,本站有权保留、转载、引用或者删除
参与本评论即表明您已经阅读并接受上述条款君,已阅读到文档的结尾了呢~~
MySQL SQLyog 编码 字符集 设置 乱码解决
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
MySQL SQLyog 编码 字符集 设置 乱码解决
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口查看: 8988|回复: 6
mysql数据库 表字段 的collation
utf8_unicode_ci
论坛徽章:18
是什么意思??如
utf8_unicode_ci& & & &
在sql2005 表字段结构如何 找到对应的表达
论坛徽章:18
字符集和Collations的一般介绍
一个character set (字符集)是一组符号和编码,而一个 collation 是在一个字符集里
比较字符的一套规则,让我们通过一个虚构的字符集例子来说明区别。
假设我们有个四个字母的字母表:`A', `B', `a', `b'.我们给每个字母一个编号:
`A' = 0, `B' = 1, `a' = 2, `b' = 3. 字母`A' 是一个符号,而数字0是 `A' 的
encoding(编码),而这四个字母和他们的编码合起来就是一个字符集(character set)。
现在,假设我们要比较两个字符串的值,`A' 和`B',最简单的方法是看编码,`A' 是 0
而 `B'是 1. 因为0比1小,我们就说`A' 比 `B' 小。现在,我们就算已经对我们的字符
集使用了一个collation,collation 是一组规则(在这个例子里只有一条规则):
&比较编码&.我们把所有可能的 collation 中最简单的这种叫做binary collation
但是如果我们想让大写字母和小写字母一样怎么办?那么我们就得有两条规则:
(1)把小写字母`a' 和 `b' 看作跟 `A' 和 `B'相等;
(2)然后比较编码。
我们称这是一个case-insensitive collation(不区分大小写的 collation).
这比binary collation 稍微复杂了一点。
在实际生活中,大多数字符集都包含很多字符:不是仅仅`A'和`B' 而是整个字母表,
有时是多个字母表或者东方书写系统里几千的字符,和很多专有符号和标点符。
并且在实际生活中,大多数的collations 有很多规则:除了不区分大小写外还有不区分
重音(重音``accent'' 是像在德语里字符附加的重音符那样的)和多字符映射。
MySQL 4.1 可以为你做以下事:
·使用各种字符集存储字符串
·使用各种collation比较字符串。
·在同一台服务器上或者同一个数据库甚至同一个表中使用不同的字符集和collation混合
·允许在任何级别上指明字符集和collation
在这些方面,MySQL 4.1 不只远远比MySQL 4.0复杂,也比其他DBMS先进很多。不过要想
有效的使用这些新特性,你需要学习哪些字符集和collation是可用的,怎样把他们改成
默认,还有各种字符串运算符如何操作他们。
10.2 MySQL 里的字符集和Collations
MySQL 服务器可支持多个字符集。要列出可用的字符集,使用 SHOW CHARACTER SET 语句:
mysql& SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+
| Charset | Description | Default collation |
+----------+-----------------------------+---------------------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci |
| dec8 | DEC West European | dec8_swedish_ci |
| cp850 | DOS West European | cp850_general_ci |
| hp8 | HP West European | hp8_english_ci |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci |
| latin1 | ISO 8859-1 West European | latin1_swedish_ci |
| latin2 | ISO 8859-2 Central European | latin2_general_ci |
输出实际上包含另一列,这里为了让例子在页面上显示更合适,没显示出来
任一给出的字符集至少包含一个collation. 它可能包含多个 collations.
要列出一个字符集的 collations , 使用 SHOW COLLATION 语句. 例如, 要看latin1
(``ISO-8859-1 West European'')的collations, 使用这个语句来找到哪些名字以latin1
开头的collation
mysql& SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | | 0 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
| latin1_danish_ci | latin1 | 15 | | | 0 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 1 |
| latin1_general_ci | latin1 | 48 | | | 0 |
| latin1_general_cs | latin1 | 49 | | | 0 |
| latin1_spanish_ci | latin1 | 94 | | | 0 |
+-------------------+---------+----+---------+----------+---------+
latin1 collations 有下列含义:
Collation 含义
latin1_bin Binary according to latin1 encoding
latin1_danish_ci Danish/Norwegian
latin1_general_ci Multilingual
latin1_general_cs Multilingual, case sensitive
latin1_german1_ci German DIN-1
latin1_german2_ci German DIN-2
latin1_spanish_ci Modern Spanish
latin1_swedish_ci Swedish/Finnish
Collations 有这些一般特性:
·两个不同字符集没法拥有同一个collation.
·每个字符集有一个默认 collation. 例如, latin1 的默认 collation 是
latin1_swedish_ci.
·collation 的命名有个约定: 他们由所关联的字符集的名字打头,他们通常包含一个
语言名, 并以 _ci (case insensitive大小写不敏感),
或者 _cs (case sensitive大小写敏感), 或者 _bin (binary二进制).
10.3 决定默认字符集和 Collation
有四个级别上的默认字符集和collation设置: 服务器,数据库,表和连接。下面的描述
可能看起来复杂,不过实践中得出多级默认设置可以带来自然而然的结果。
10.3.1 服务器级字符集和 Collation
MySQL服务器有一个服务器级别的字符集和 collation, 不能为空。
MySQL 这样决定服务器级的字符集和collation
·当服务器开始按照有效选项设置
·运行期间按照变量
在服务器级别,决定是很简单的,依靠你执行mysqld时使用的选项来决定服务器字符集
和collation。你可以使用--default-character-set 来指定字符集,并且和这个一起
还可以为collation加上--default-collation 。如果你不指定字符集,就相当于说
--default-character-set=latin1。如果你只指定了字符集(例如,latin1)但是没有指定
collation,就相当于
--default-charset=latin1 --default-collation=latin1_swedish_ci
因为 latin1_swedish_ci是latin1字符集的默认collation, 因此下面三个命令都具有
同样效果:
shell& mysqld
shell& mysqld --default-character-set=latin1
shell& mysqld --default-character-set=latin1 /
--default-collation=latin1_swedish_ci
有个改变这个设置的方法是重新编译,如果你想编译源码来改变默认的服务器字符集和
collation,在configure使加上参数--with-charset 和 --with-collation ,例如:
shell& ./configure --with-charset=latin1
shell& ./configure --with-charset=latin1 /
mysqld 和configure 都会核实字符集/collation的结合是否有效,如果无效,这两个
程序都会报错并中止。
现行服务器字符集和collation 是和character_set_server 和 collation_server
这两个系统变量的值一样,这些变量可以在运行时更改
10.3.2 数据库字符集和 Collation
每个数据库都有一个数据库字符集和数据库collation,并且不能为空,CREATE DATABASE
和 ALTER DATABASE 语句有专门指明数据库字符集和collation的可选子句:
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
CREATE DATABASE db_name
DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_
MySQL可以这样选择数据库字符集和数据库collation:
·如果 CHARACTER SET X 和 COLLATE Y 被指定了, 那么字符集是 X collation 是 Y.
·如果 CHARACTER SET X 被指定,但是没有指定 COLLATE, 那么字符集是 X collation
是默认collation.
·否则, 就用服务器字符集和服务器 collation.
MySQL 的 CREATE DATABASE ... DEFAULT CHARACTER SET ... 语法类似于标准 SQL
的 CREATE SCHEMA ... CHARACTER SET ... 语法. 因为这样, 就可能在同一个MySQL
服务器上创建具有不同字符集和collation的数据库。
如果在建表的语句里没有指定表的字符集和collation,那么数据库字符集和 collation
就作为表的字符集和collation的默认值. 它们没有别的作用。
默认数据库的字符集和 collation是和 character_set_database 以及
collation_database 这两个系统变量的值一样。 当默认数据库更改时服务程序会设置
这些变量的值。如果没有默认数据库, 变量的值会和配套的服务器级系统变量
character_set_server 以及 collation_server的值一致.
10.3.3 表字符集和 Collation
每个表有一个表字符集以及一个表collation,不能为空。CREATE TABLE 和 ALTER TABLE
语句有可选子句指定表字符集和collation。
CREATE TABLE tbl_name (column_list)
[DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name
[DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]
CREATE TABLE t1 ( ... )
DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_
MySQL 通过下面的方法选择表字符集和collation:
·如果 CHARACTER SET X 和 COLLATE Y 都被指定了, 那么字符集就是 X collation 是Y
·如果只指定了CHARACTER SET X 而没有指定 COLLATE, 那么字符集为 X 并配默认的
collation.
·否则就使用数据库字符集和 collation.
表字符集和 collation 用来在没有指定个别列字符集和列collation的时候做为它们
的默认值。表字符集和 collation 是MySQL 的扩展;在标准SQL里没有这种东西
10.3.4 列字符集和 Collation
每个``character'' 列(是指列属性为CHAR, VARCHAR, 或 TEXT的)都有一个列字符集
和一个列collation,不能为空。列定义语句有可选子句指定列字符集和collation:
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name [COLLATE collation_name]]
CREATE TABLE Table1
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
MySQL 这样选择列字符集和collation:
·如果 CHARACTER SET X 和 COLLATE Y 都被指定了, 那么字符集就是 X collation 就是 Y.
·如果指定了 CHARACTER SET X 但没有指定 COLLATE, 那么字符集是 X 并配默认的collation.
·否则,就用表字符集和 collation.
CHARACTER SET 和 COLLATE 子句是标准SQL.
10.3.5 字符集和 Collation 分配的例子
下面的例子显示了 MySQL 怎样决定默认的字符集和collation的值:
例子1:表+列定义
CREATE TABLE t1
c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
) DEFAULT CHARACTER SET latin2 COLLATE latin2_
这里我们有一个用latin1的字符集和latin1_german1_ci collation的列。
定义非常明显,所以很简单。注意把一个latin1 的列存到一个latin2的表里不会有问题
例子2:表+列定义
CREATE TABLE t1
c1 CHAR(10) CHARACTER SET latin1
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_
这次我们有一列是latin1字符集加默认的collation。现在,虽然它看上去很自然,
但是默认的collation却不是从表级继承而来。事实上,因为latin1的默认collation
始终是latin1_swedish_ci,所以c1列的collation是latin1_swedish_ci (而不是
latin1_danish_ci).
例子3:表+列定义
CREATE TABLE t1
c1 CHAR(10)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_
我们有一个默认字符集和默认collation的列。在这个环境下,MySQL向上到表级决定
列字符集和collation。所以,c1的列字符集是latin1,它的collation是
latin1_danish_ci
例子4:数据库+表+列定义
CREATE DATABASE d1
DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_
CREATE TABLE t1
c1 CHAR(10)
我们创建了一个没有指定列字符集和collation的列。我们也没有指定表级字符集和
collation。在这个条件下,MySQL向上到数据库级决定。(数据库的设置变为表的设置,
之后成为列的设置),所以c1的列字符集是latin2,collation是latin2_czech_ci
10.3.6 连接的字符集和Collations
一些字符集和collation和用户对服务器的作用结合。有些在前面已经提及了:
·服务器的字符集和collation和 character_set_server 及 collation_server 变量
·默认数据库的字符集和collation和 character_set_database 及 collation_database
变量的值一样.
附加的字符集和collation 变量被引入用来处理服务器和客户端之间连接得通信。每个
客户端都有连接相关的字符集和collation变量。
想想“连接”是什么:是你连到服务器时作的事情。客户端通过这条连接发送SQL语句,
比如查询,服务器则通过这条连接给客户端送回回应,比如查询结果结果集合,这导致
了客户端处理字符集和collation的一些问题,它们每个都可以按照系统变量来回答:
·当查询离开客户端的时候应该是什么字符集的?服务器用character_set_client
这个变量来作为客户端发送查询所用的字符集
·服务器端在接收到了查询以后应该把它翻译到社么字符集里?对于这个,服务程序
用的是character_set_connection 和 collation_connection 这两个变量。
它把客户端送来的查询从character_set_client 转换成character_set_connection
(除了latin1或者utf8 的字符串)。collation_connection 对于比较字符串非常
重要,对于列值比较字符串是没有关系的,因为列拥有高优先级
·当服务程序要送回结果集合或者错误信息给客户端时应该用什么字符集?
character_set_results 变量指示了这个值,这包括了列值,或者列名等结果数据。
你可以调整这些变量的值,或者就使用默认的(那样就可以省略这节了)
有两个语句影响连接字符集设置:
SET NAMES 'charset_name'
SET CHARACTER SET charset_name
SET NAMES 指出客户端送出的SQL语句里是什么。因此,SET NAMES 'cp1251' 就告诉服务
程序“下面将要从这个客户端送来的信息将是使用'cp1251'这个字符集。这也指定了
服务程序送回的结果所用的字符集,(例如如果你用了一个SELECT语句它会指出列值
拥有的字符集)
SET NAMES 'x' 语句相当于下面三个语句:
mysql& SET character_set_client =
mysql& SET character_set_results =
mysql& SET character_set_connection =
把character_set_connection 设置成x也会把collation_connection 设置成默认
collation x
SET CHARACTER SET 是类似的,不过是把连接字符集和collation设置成那些默认数据库。
SET CHARACTER SET x 语句相当于这三个语句:
mysql& SET character_set_client =
mysql& SET character_set_results =
mysql& SET collation_connection = @@collation_
当一个客户连接,它向服务程序发送它想使用的字符集的名字,服务程序把
character_set_client, character_set_results, 和 character_set_connection
这些变量设置成那个字符集(事实上,服务程序使用字符集执行了SET NAMES 操作)
如果你不想用默认字符集,使用 Mysql 客户端程序不需要每次启动时执行SET NAMES 。
你可以在mysql 执行语句行加上--default-character-set 这个选项,或者在你的选项
文件里加上。比如,下面的选项文件设置使你每次执行mysql程序时把默认字符集变量
改成 koi8r:
default-character-set=koi8r
例如:假设column1定义是 CHAR(5) CHARACTER SET latin2。如果你不用SET NAMES
或者 SET CHARACTER SET,那么对于你的 SELECT column1 FROM t 请求,服务程序
会把column1 的所有值用连接建立时客户端指定的字符集来回送。另一方面,如果你
用了 SET NAMES 'latin1' or SET CHARACTER SET latin1 ,那么在送回结果之前,
服务程序会把 latin2 的值转成latin1,如果里面有两种字符集里都没有的字符,
转化会有损耗。
如果你不希望服务程序作任何转换,就把character_set_results 设置成 NULL
mysql& SET character_set_results = NULL;
10.3.7. 字符串文字字符集和collation
每个字符串文字都有自己的字符集和collation,不能为空
一个字符串文字可能有一个可选字符集introducer和COLLATION子句:
[_charset_name]'string' [COLLATE collation_name]
SELECT 'string';
SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_
对于简单语句 SELECT 'string',字符串的字符集和collation是由两个系统变量
character_set_connection 和 collation_connection 定义的。
_charset_name 表达式正式情况下被叫做 introducer .它告诉分析器“下面的字符串
是使用 X 字符集的。”因为这在以前造成很多人的困扰,我们强调一下introducer
并不作任何转换,严格来讲并不改变字符串的值,只是一个符号。introducer 在
标准16进制文字前和数字16进制记法前都是合法的(x'literal' 和 0xnnnn),
在?前面也是合法的(当在程序设计语言接口里使用预备语句时作参数替换)
SELECT _latin1 x'AABBCC';
SELECT _latin1 0xAABBCC;
SELECT _latin1 ?;
MySQL 这样决定一个文字的字符集和collation:
·如果 _X 和 COLLATE Y 都被指定了,那么字符集就是 X collation 是 Y
·如果 指定了 _X 而没有指定 COLLATE ,那么字符集是 X collation 是 X 的默认
·否则,由系统变量 character_set_connection 和 collation_connection 决定字符集
和collation
·一个字符集是 latin1 而collation是 latin1_german1_ci 的字符串:
SELECT _latin1'Müller' COLLATE latin1_german1_
·一个字符集是 latin1 以及其配套默认collation的(latin1_swedish_ci)字符串:
SELECT _latin1'Müller';
·一个连接默认字符集和collation的字符串:
SELECT 'Müller';
字符集 introducer 和 COLLATE 子句是符合标准 SQL 规则的工具
10.3.8. 在 SQL 语句里使用 COLLATE
通过 COLLATE 子句,你可以在比较时覆盖替换掉任何默认collation, COLLATE 可以用
在SQL 语句的很多部分里,这里是一些例子:
·在 ORDER BY 里:
ORDER BY k COLLATE latin1_german2_
·在 AS 里:
SELECT k COLLATE latin1_german2_ci AS k1
ORDER BY k1;
·在GROUP BY里 :
GROUP BY k COLLATE latin1_german2_
·在集合函数里:
SELECT MAX(k COLLATE latin1_german2_ci)
·在DISTINCT里
SELECT DISTINCT k COLLATE latin1_german2_ci
·在WHERE 里:
WHERE _latin1 'Müller' COLLATE latin1_german2_ci =
·在HAVING里:
GROUP BY k
HAVING k = _latin1 'Müller' COLLATE latin1_german2_
User Comments
Posted by [name withheld] on January 14 pm
在不同的列/表里:
SELECT t1.k FROM t1 WHERE NOT EXISTS
( SELECT * FROM t2 WHERE t1.k=t2.k COLLATE latin1_german2_ci);
在collation 之间比较列的时候能够避免出错信息。
10.3.9. COLLATE 子句优先级
COLLATE子句具有高优先级(比||高),所以下面两个表达式是相同的:
x || y COLLATE z
x || (y COLLATE z)
10.3.10. BINARY 运算
BINARY 运算是COLLATE 子句的速记法,BINARY 'x' 和 'x' COLLATE y 是相同的,
y 是字符集 'x' 的二元collation 的名字。每个字符集都有二元 collation。例如,
latin1 字符集的 collation 是latin1_bin,所以如果列 a 是latin1 字符集,下面
两个语句有同样效果:
SELECT * FROM t1 ORDER BY BINARY
SELECT * FROM t1 ORDER BY a COLLATE latin1_
10.3.11. 一些决定collation 比较棘手的情况
在绝大多数查询里,MySQL 用什么collation来进行比较操作都是很显而易见的,例如,
在下面的情况里,很显然collation 应该是“列 x 的列 collation”:
SELECT x FROM T ORDER BY
SELECT x FROM T WHERE x =
SELECT DISTINCT x FROM T;
但是,当卷入了多操作数时,就很难搞了,例如:
SELECT x FROM T WHERE x = 'Y';
这个查询应该使用列 x 的collation 呢,还是使用字符串'Y' 的?
标准SQL 使用被叫做``coercibility'' 的规则来解决这个问题。本质就是:因为
x 和 'Y' 都有collation ,优先使用谁的collation呢?这很复杂,不过下面的规则能
应付大多数情况:
·一个COLLATE 子句的 coercibility 是0 (也就是根本不coercible)
·两个具有不同collation 的字符串连结的 coercibility 是1
·一个列的 collation 的 coercibility 是 2
·一个文字型的collation 的 coercibility 是3。
那些规则这样解决含混:
·使用具有最低 coercibility 值的collation
·如果两边具有相同的 coercibility, 如果两个collation 不同那就是错误。
column1 = 'A' 使用column1的collation
column1 = 'A' COLLATE x 使用 'A' 的collation
column1 COLLATE x = 'A' COLLATE y Error
COERCIBILITY() 函数可以用来判断一个字符串表达式的coercibility:
mysql& SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);
mysql& SELECT COERCIBILITY('A');
User Comments
Posted by Thierry Danard on November 5 pm
对于数据库引擎来说显而易见的排序并不是总那么显而易见(version 4.1).
一个没有带类似于&select concat(mycolumn, '%') from mytable &这样的排序指令
的查询在&mycolumn& 和&%&的字符集不相同的情况下不会工作。
在我这里,整个数据库使用 UTF-8, 默认情况下, '%' 假设是 latin1,
causing an error to be triggered。
10.3.12. Collations Must Be for the Right Character Set
记得说过每个字符集都有一个或者多个collation,每个collation只和一个字符集关联。
因此,下面的语句会导致错误,因为 latin2_bin 这个collation 和 latin1 这个字符集
mysql& SELECT _latin1 'x' COLLATE latin2_
ERROR 1251: COLLATION 'latin2_bin' is not valid
for CHARACTER SET 'latin1'
在某些情况下,在 MySQL 4.1 前工作的表达式会在MySQL 4.1以后的版本失败,
如果你在帐号里没有字符集和collation的话。例如,在 MySQL 4.1 前,这个语句
会这样工作:
mysql& SELECT SUBSTRING_INDEX(USER(),'@',1);
+-------------------------------+
| SUBSTRING_INDEX(USER(),'@',1) |
+-------------------------------+
+-------------------------------+
升级到MySQL 4.1 以后,语句失效:
mysql& SELECT SUBSTRING_INDEX(USER(),'@',1);
ERROR 1267 (HY000): Illegal mix of collations
(utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)
for operation 'substr_index'
发生这个的原因是username 使用utf8存储(参看10.6节),因此, USER() 函数
和文字型字符串'@'具有不同的字符集(当然也是不同collation):
mysql& SELECT COLLATION(USER()), COLLATION('@');
+-------------------+-------------------+
| COLLATION(USER()) | COLLATION('@') |
+-------------------+-------------------+
| utf8_general_ci | latin1_swedish_ci |
+-------------------+-------------------+
解决的一个方法是告诉MySQL把文字型字符串翻译成utf8:
mysql& SELECT SUBSTRING_INDEX(USER(),_utf8'@',1);
+------------------------------------+
| SUBSTRING_INDEX(USER(),_utf8'@',1) |
+------------------------------------+
+------------------------------------+
另一个方法是把连接的字符集和collation改成utf8,你可以使用SET NAMES 'utf8'
或者直接设置两个系统变量character_set_connection 和 collation_connection
的值来达到这个目的。
10.3.13. Collation 的效果的一个例子
假设表 T 里的列 X 具有这些 latin1 的列值:
MX Systems
并且假设这些列值可以用下列语句找回:
SELECT X FROM T ORDER BY X COLLATE collation_
在这张表中列出了不同collation 的结果值的结果排序
latin1_swedish_ci latin1_german1_ci latin1_german2_ci
Muffler Muffler Müller
MX Systems Müller Muffler
Müller MX Systems MX Systems
MySQL MySQL MySQL
这张表显示了如果我们在一个 ORDER BY 子句里使用不同collation 会有什么样的效果
的例子,导致这种不同排序结果的字符是上面有两个点的 U,在德语里叫做U-曲音,
不过我们叫做U-分音符
·第一列显示了使用瑞典/芬兰 collation 规则的 SELECT 的结果,U-分音符
·第二列显示了使用德语DIN-1 规则的SELECT 语句的结果,U-分音符通过U归类
·第三列显示了使用德语DIN-2 规则的SELECT 语句的结果,U-分音符通过UE归类
三种不同的collation ,三种不同的结果,这是MySQL 在这里的处理。通过使用合适的
collation,你可以选择你想要的排序次序。
该文章转载自宋氏电脑 技术无忧:
论坛徽章:18
MySQL增强了对字符集的支持。
名词解释:
—————————————————–
字符集(character set)是一套符号和编码。
而校对(collation)是在该字符集下,用于比较字符的一个规则。
—————————————————–
对于数据库,有四种级别的编码和整理设定:
2. database
  SQL标准只定义了server和database级别的字符集,MySQL在此基础上,增加了对table和column字符集的支持。下面是相应的语法:
————–
–character-set-server
–collation-server
编译时指定服务器编码
shell& ./configure –with-charset=latin1
shell& ./configure –with-charset=latin1 \
–with-collation=latin1_german1_ci
2. database
————–
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
eg: CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_
————–
CREATE TABLE tbl_name (column_list)
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]]
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
eg: CREATE TABLE t1 ( … ) CHARACTER SET latin1 COLLATE latin1_danish_
* The table character set and collation are MySQL there are no such things in standard SQL.
4. column (only available for CHAR, VARCHAR and TEXT)
————–
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name] [COLLATE collation_name]
CREATE TABLE Table1
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
1. 客户端以什么字符集来发送SQL命令?
character_set_client
2. 当服务器接收到SQL命令时,它会将其转换成什么字符集?
character_set_connection and collation_connection
服务器将客户端发送的SQL命令从character_set_client转换到character_set_connection
在进行字符串比较时,collation_connection将起作用。
但是在进行column中字符串比较时,collation_connection将不起作用,因为column有自己的collation。
3. 服务器将以什么字符集发送 给果/错误信息 给客户端?
character_set_results
---------------------------------
有两个语句可以改变connection character set:
1. SET NAMES ‘charset_name’;
2. SET CHARACTER SET charset_
SET NAMES告诉服务器客户端将使用什么样的字符集来发送SQL命令,也同时指定服务器返回给客户端所使用的字符集。
SET NAMES ‘x’ 等效于:
SET character_set_client =
SET character_set_results =
SET character_set_connection =
(注:SET character_set_connection = 语句同时也自动指定了字符集x的默认collation为 collation_connection的值,但也可以用 SET NAMES ‘charset_name’ COLLATE ‘collation_name’来提定你想使用的collation。)
SET CHARACTER SET和SET NAMES作用相似,但它将连接的字符集和collation设置为默认数据库的字符集和collation。
SET CHARACTER SET x 等效于:
SET character_set_client =
SET character_set_results =
SET collation_connection = @@collation_
(注:SET collation_connection同时也会自动设置character_set_connection。)
如果不希望MySQL在返回结果时进行转换,可以使用SET character_set_results = NULL;语句
论坛徽章:40
这个东西是为了定义排序规则的。
论坛徽章:40
如果是WINDOWS程序对数据的访问的话也会出现好多这样的问题。
论坛徽章:6
论坛徽章:2
这个不错,学习了
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号

我要回帖

更多关于 桐乡市互联网学校 的文章

 

随机推荐