-
2019-09-05 18:58:42
mysql的collation大致的意思就是字符序。首先字符本来是不分大小的,那么对字符的>, = , < 操作就需要有个字符序的规则。collation做的就是这个事情,你可以对表进行字符序的设置,也可以单独对某个字段进行字符序的设置。一个字符类型,它的字符序有多个,比如:
下面是UTF8对应的字符序。
utf8_general_ci utf8 33 Yes Yes 1 utf8_bin utf8 83 Yes 1 utf8_unicode_ci utf8 192 Yes 8 utf8_icelandic_ci utf8 193 Yes 8 utf8_latvian_ci utf8 194 Yes 8 utf8_romanian_ci utf8 195 Yes 8 utf8_slovenian_ci utf8 196 Yes 8 utf8_polish_ci utf8 197 Yes 8 utf8_estonian_ci utf8 198 Yes 8 utf8_spanish_ci utf8 199 Yes 8 utf8_swedish_ci utf8 200 Yes 8 utf8_turkish_ci utf8 201 Yes 8 utf8_czech_ci utf8 202 Yes 8 utf8_danish_ci utf8 203 Yes 8 utf8_lithuanian_ci utf8 204 Yes 8 utf8_slovak_ci utf8 205 Yes 8 utf8_spanish2_ci utf8 206 Yes 8 utf8_roman_ci utf8 207 Yes 8 utf8_persian_ci utf8 208 Yes 8 utf8_esperanto_ci utf8 209 Yes 8 utf8_hungarian_ci utf8 210 Yes 8 utf8_sinhala_ci utf8 211 Yes 8 utf8_german2_ci utf8 212 Yes 8 utf8_croatian_ci utf8 213 Yes 8 utf8_unicode_520_ci utf8 214 Yes 8 utf8_vietnamese_ci utf8 215 Yes 8 utf8_general_mysql500_ci utf8 223 Yes 1
mysql的字符序遵从命名惯例。以_ci(表示大小写不敏感),以_cs(表示大小写敏感),以_bin(表示用编码值进行比较)。比如:
CREATE TABLE `issue_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL, PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
这个表下面的两个sql会出现同样的结果
select * from issue_message where content = 'Yes' select * from issue_message where content = 'yes'
如果改成下面的定义:
CREATE TABLE `issue_message` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL COLLATE utf8_bin, PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
那么两个sql结果就会不一样了
所以,如果对字符大小敏感的话,最好将数据库中默认的utf8_general_ci设置为utf8_bin。
更多相关内容 -
MYSQL数据库MySQL collation方法
2021-03-03 21:00:56作者:VEPHP 时间 2017-09-15《MYSQL数据库MySQL collation方法》要点:本文介绍了MYSQL数据库MySQL collation方法,希望对您有用。如果有疑问,可以联系我们。问题是这样的:一张test的表,字符集采用的latin1....作者:VEPHP 时间 2017-09-15
《MYSQL数据库MySQL collation方法》要点:
本文介绍了MYSQL数据库MySQL collation方法,希望对您有用。如果有疑问,可以联系我们。问题是这样的:
一张test的表,字符集采用的latin1.
select to_id from test where to_id='cn象_王';
+---------------+
| to_id |
+---------------+
| cn陶_陶 |
| cn象_王 |
+---------------+
2 rows in set (0.00 sec)
取cn象_王的数据,居然把cn陶_陶的数据也取回来了.
这显然是不允许的.
查看它们的编码:
(root@im_offlog1a)[test]> select hex('cn陶_陶');
+----------------+
| hex('cn陶_陶') |
+----------------+
| 636ECCD55FCCD5 |
+----------------+
1 row in set (0.00 sec)
(root@im_offlog1a)[test]> select hex('cn象_王');
+----------------+
| hex('cn象_王') |
+----------------+
| 636ECFF35FCDF5 |
+----------------+
1 row in set (0.00 sec)
编码的确是不一样的,但是为什么mysql会认为这两条记录是一样的呢?
一开始我们就把问题定位于collation引起的问题.
show variables查看
| collation_connection | latin1_swedish_ci
| collation_database | latin1_swedish_ci
| collation_server | latin1_swedish_ci
手工把这些参数修改为latin1_bin,结果居然一样.这下感觉真是奇怪了.
这里先解释一下mysql collation的命名规则:
它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束
比如latin1字符集有以下几种校正规则:
校对规则 含义
latin1_german1_ci 德国DIN-1
latin1_swedish_ci 瑞典/芬兰
latin1_danish_ci 丹麦/挪威
latin1_german2_ci 德国 DIN-2
latin1_bin 符合latin1编码的二进制
latin1_general_ci 多种语言(西欧)
latin1_general_cs 多种语言(西欧ISO),大小写敏感
latin1_spanish_ci 现代西班牙
最后我们将表格重建,手工指定表格级别的collation为latin1_bin.
这个问题就得到了解决.
那么问题又来了,为什么我前面手工测试latin1_bin时不生效呢?
原来MySQL按照下面的方式选择表字符集和 校对规则:
如果指定了CHARACTER SET X和COLLATE Y,那么采用CHARACTER SET X和COLLATE Y.
如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET X和CHARACTER SET X的默认校对规则.
否则,采用服务器字符集和服务器校对规则.
而我们在建表的时候指定了character set,所以它永远是采用对应的默认的校对规则.
当然我们其实也没必要重建表格,只需要alter table db_allot CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin这样转换即可.
另外建议collation都尽量采用字符集相应的bin类型的校对规则,这样不容易出错.
再说说我自己的体会
觉得 character set latin1 collate latin1_bin 就是老版的 VARCHAR BINARY 的改进,只是新版的先用 character set 定字符集,再用此字符集名字加 _bin 定校对规则为二进制的,从而确保中文查询正确.
再测试了一下,把此字段属性改为不带 BINARY 的
ALTER TABLE `comment_content_1_01` CHANGE `thread` `thread` VARCHAR( 50 ) DEFAULT NULL
然后再看表结构确实变成 `thread` varchar(50) default NULL, 即不带 character set latin1 collate latin1_bin 了,可见character set latin1 collate latin1_bin 就是老版的 VARCHAR BINARY 的改进.
此外还读到更方便的做法,不用逐个改字段属性,而只要表格级别的collation为latin1_bin就行了.
测试:
alter table comment_content_1_01 CONVERT TO CHARACTER SET latin1 COLLATE latin1_bin
后,
再导出表结构
CREATE TABLE comment_content_1_01 (
content_id int(11) NOT NULL auto_increment,
thread varchar(50) collate latin1_bin default NULL,
uname varchar(100) collate latin1_bin default NULL,
nick varchar(100) collate latin1_bin default NULL,
uid int(11) unsigned default NULL,
content text collate latin1_bin,
post_time datetime default NULL,
post_ip int(10) unsigned default NULL,
`status` enum('unaudit','normal','deleted') collate latin1_bin NOT NULL default 'unaudit',
PRIMARY KEY (content_id)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
即便原来没定各字段的 collate,现在也全都是 collate latin1_bin 了.
标签:
-
【数据库】Collation 设定
2021-03-17 11:47:15有听过资料库的collation (校对)设定吗? 讲到collation,最常提到的就是英文大小写case sensitive 跟case insensitive. 安装SQL Server 资料库,instance level 的内定collation 设定是SQL_Latin1_General_CP1_CI...有听过资料库的collation (校对)设定吗?
讲到collation,最常提到的就是英文大小写case sensitive 跟case insensitive. 安装SQL Server 资料库,instance level 的内定collation 设定是SQL_Latin1_General_CP1_CI_AS,就是case insensitive.
常见的问题是可以在同一个SQL instance 下建立不同collation 的databases 吗?答案是可以的。
可以自己试看看喔。
-
mysql新建数据库时的collation选择(转)
2021-03-03 18:08:55转自:https://www.cnblogs.com/sonofelice/p/6432986.htmlmysql新建数据库时的collation选择(转)转自别处的文章。末尾附原文链接mysql的collation大致的意思就是字符序。首先字符本来是不分大小的,那么对字符的>...转自:https://www.cnblogs.com/sonofelice/p/6432986.html
mysql新建数据库时的collation选择(转)
转自别处的文章。末尾附原文链接
mysql的collation大致的意思就是字符序。首先字符本来是不分大小的,那么对字符的>, = , < 操作就需要有个字符序的规则。collation做的就是这个事情,你可以对表进行字符序的设置,也可以单独对某个字段进行字符序的设置。一个字符类型,它的字符序有多个,比如:
下面是UTF8对应的字符序。
utf8_general_ci utf8 33 Yes Yes 1
utf8_bin utf8 83 Yes 1 utf8_unicode_ci utf8 192 Yes 8 utf8_icelandic_ci utf8 193 Yes 8 utf8_latvian_ci utf8 194 Yes 8 utf8_romanian_ci utf8 195 Yes 8 utf8_slovenian_ci utf8 196 Yes 8 utf8_polish_ci utf8 197 Yes 8 utf8_estonian_ci utf8 198 Yes 8 utf8_spanish_ci utf8 199 Yes 8 utf8_swedish_ci utf8 200 Yes 8 utf8_turkish_ci utf8 201 Yes 8 utf8_czech_ci utf8 202 Yes 8 utf8_danish_ci utf8 203 Yes 8 utf8_lithuanian_ci utf8 204 Yes 8 utf8_slovak_ci utf8 205 Yes 8 utf8_spanish2_ci utf8 206 Yes 8 utf8_roman_ci utf8 207 Yes 8 utf8_persian_ci utf8 208 Yes 8 utf8_esperanto_ci utf8 209 Yes 8 utf8_hungarian_ci utf8 210 Yes 8 utf8_sinhala_ci utf8 211 Yes 8 utf8_german2_ci utf8 212 Yes 8 utf8_croatian_ci utf8 213 Yes 8 utf8_unicode_520_ci utf8 214 Yes 8 utf8_vietnamese_ci utf8 215 Yes 8 utf8_general_mysql500_ci utf8 223 Yes 1
mysql的字符序遵从命名惯例。以_ci(表示大小写不敏感),以_cs(表示大小写敏感),以_bin(表示用编码值进行比较)。比如:
CREATE TABLE `issue_message` (
`id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL, PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
这个表下面的两个sql会出现同样的结果
select * from issue_message where content = 'Yes' select * from issue_message where content = 'yes'
如果改成下面的定义:
CREATE TABLE `issue_message` (
`id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) NOT NULL COLLATE utf8_bin, PRIMARY KEY (`id`), ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
那么两个sql结果就会不一样了
所以,如果对字符大小敏感的话,最好将数据库中默认的utf8_general_ci设置为utf8_bin。
好文要顶
关注我
收藏该文
-
mysql数据库 表字段 的collation utf8_unicode_ci
2021-01-19 11:48:14字符集和Collations的一般介绍一个character set (字符集)是一组符号和编码,而一个 collation 是在一个字符集里比较字符的一套规则,让我们通过一个虚构的字符集例子来说明区别。假设我们有个四个字母的字母表:`A'... -
批量更改数据库COLLATION
2014-06-11 14:30:00企业内部有很多系统是繁体的,由于各方面的原因,公司目前正在实行简体化,但各...我们新的数据库均采用Chinese_PRC_BIN collation, 所以我们直接把旧系统备份一份,然后恢复到新的服务器上,同时更改数据库的collat... -
改变数据库Collation 失败,请高手指点
2014-06-26 10:57:51” 我查了一些资料,觉得可能是 数据库 Collation:SQL_Latin1_General_CP1_CI_AS 这里的原因,我想把这个字表的collation 改成 Chinese_PRC_CI_AS 但是尝试了很多种方法都失败 ,请高手指点下! 谢谢啦[img=... -
SQL server 2005 创建数据库失败提示“Collation <服务器默认值> is not valid”解决方法...
2019-09-24 02:52:11今天在创建数据库时发生了问题,新建数据库错误提示”Collation ‘<服务器默认值>’ is not valid.(Microsoft.SqlServer.Express.Smo)”,自己的系统环境为Windows 7 Ultimate英文版,不知为何?在我的一番... -
mysql 中 character set 与 collation 的点滴理解
2021-01-27 12:51:15使用 mysql 创建数据表的时候, 总免不了要涉及到 character set 和 collation 的概念, 之前不是很了解。这两天不是很忙, 就自己整理了一下。先来看看 character set 和 collation 的是什么?&. character set... -
mysql的default collation
2019-12-26 15:09:56mysql的collation大致的意思就是字符序。首先字符本来是不分大小的,那么对字符的>, = , < 操作就需要有个字符序的规则。collation做的就是这个事情,你可以对表进行字符序的设置,也可以单独对某个字段进行... -
SQL中的Collation是个什么鬼?
2015-06-15 17:31:41一、说文解字,学习一下Collation的字面意思:排序。 (https://en.wikipedia.org/wiki/Collation) 二、SQL中的Collation,描述了如何对查询出来的数据进行比较和排序,本质是定义了两个cell的数据进行比较的时候... -
如何修改mysql数据库编码
2021-03-16 10:35:39在建网站时,有时需要将一个数据库里的数据导入到另一个数据库里,但往往会出现二个数据库的编码不同,造成网页乱码。解决方法就是修改数据库编码。下面介绍一下如何修改MYSQL数据库编码的方法。方法/步骤首先下载一... -
WordPress导入数据库出现”Unknown collation: ‘utf8mb4_unicode_ci”错误的解决办法
2020-09-10 07:04:47主要介绍了WordPress导入数据库出现”Unknown collation: ‘utf8mb4_unicode_ci”错误的解决办法的相关资料,需要的朋友可以参考下 -
[SQL] SQLServer修改DB的collation, 解决排序字规则字符集问题
2018-01-26 19:16:38以前用别人备份的sqlserver的srcipt在执行创建视图操作...--表 -- 列 三者的Collation字符排序集都改一遍才可以。 Cannot resolve the collation conflict between "Japanese_CI_AS" and "SQL_Latin1_General_CP1_CI_ -
GBase8s数据库SET COLLATION 语句
2022-07-20 10:43:28如果您未设定DB_LOCALE的值,则基于UnitedStatesEnglish,对于UNIX™的缺省的语言环。使用SETCOLLATION语句来指定该会话...响其他的会话,但您以非缺省的对照创建的数据库对象使用在他们创建时有效的任何对照顺序。... -
设置collation_database collation_server
2016-11-19 13:20:31写入mysql数据库时tomcat报错:Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ‘=数据库字符集的不相符的问题: 用navicat打开数据库的命令行: 如图: ... -
【数据库-MySql】查看字符集校对规则(一)
2019-04-11 11:04:28SHOW COLLATION语法 SHOW COLLATION [LIKE 'pattern' | WHERE expr] 示例 -- 显示所有项 SHOW COLLATION; -- 显示 Collation字段值包含bin的项 SHOW COLLATION LIKE '%bin%'; -- 显示 Charset字段值等于utf8mb4... -
mariadb(mysql)数据库字符集设置(二)(centos7)
2019-10-27 09:42:24mariadb(mysql)数据库字符集设置(centos7) -
SQL Server 2005 创建数据库失败提示“Collation is not valid”解决方法
2009-12-07 21:55:00由于安装的SQL Server 2005是中文版本,所以将“选项”中排序规则由给出的为默认值改为”Chinese_PRC_CI_AS”就OK了。 -
SQL Server 更改DB的Collation
2020-09-11 09:49:09经常发现同事爲了更改DB的Collation而删掉DB,重新创建过。其实,只要一条SQL就可以解,唔使哽麻烦!! -
SQL SERVER 从Excel导入数据时不同语言字符集的比较问题
2016-12-05 17:29:18环境:window 7+sqlserver 2008不同的电脑上的两个数据库DB1、DB2DB1数据库字符集: SQL_Latin1_General_CP1_CI_ASDB2数据库字符集: Chinese_Taiwan_Stroke_CI_AS从Excel中导入数据到临时表中,然后和数据库表中现有... -
语法教学02 建立与删除数据库, 简单说明Character与Collation的选择
2021-08-31 20:07:09[MySQL][關聯式資料庫][DB]_語法教學#02__建立與刪除資料庫,_簡單說明Character與Collation的選 -
GBase8s数据库对 SET COLLATION 的限制
2022-07-20 10:48:54如果您未设定DB_LOCALE的值,则基于UnitedStatesEnglish,对于UNIX™的缺省的语言环。使用SETCOLLATION语句来指定该会话...响其他的会话,但您以非缺省的对照创建的数据库对象使用在他们创建时有效的任何对照顺序。... -
导入mysql数据库Unknown collation:‘utf8mb4_unicode_ci’错误的解决办法
2021-01-28 02:14:31wordpress(4.6版本)转移空间时,导入新空间数据库时出现了#1273 – Unknown collation: ‘utf8mb4_unicode_ci’ 的错误,这是数据库编码的问题,查了网上的一些资料,出现这个问题的原因在于,wordpress4.2版本之后... -
MYSQL WORKBENCH创建数据库和表
2016-05-17 15:23:08MySQL Workbench 就是 MySQL 官方 为 MySQL 提供的一款可视化管理工具,MySQL Workbench 下载页: ... 1、启动mysql workbench,链接数据库。 菜单database-connect to database,打开local i