MySQL表排序规则不同报错问题分析
技术百科
小云云
发布时间:2017-12-14
浏览: 次 mysql多表join时报错如下:[err]1267 – illegal mix of collations(utf8_general_ci,implicit) and (utf8_unicode_ci,implicit) for operation ‘=
就是说两个表的排序规则(COLLATION)不同,无法完成比较。COLLATION是用在排序,大小比较上,一个字符集有一个或多种COLLATION,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二进制)结束。在做比较时,应该确保两个表的字符排序相同。一般建表的时候不指定,可以走默认的,全是默认的就没什么问题了。本文主要介绍了MySQL表排序规则不同错误问题分析,希望能帮助到大家。
下面来模拟一下各种场景,表结构如下(utf8默认排序规则为utf8_general_ci):
mysql> show create table test.cs\G
*************************** 1. row ***************************
Table: cs
Create Table: CREATE TABLE `cs` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)查看表默认排序规则集
mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_general_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec)
查看列排序规则集
mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_general_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
从utf8升级为utf8mb4是不支持online ddl的,如下:
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8mb4,ALGORITHM=INPLACE,LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
从utf8.utf8_general_ci变更为utf8.utf8_unicode_ci是不支持online ddl的,如下:
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci,ALGORITHM=INPLACE,LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
如果使用下面这种方式修改字符集,你会发现,只更改了表级的,没有更改列级的。
mysql> ALTER TABLE cs CHARACTER SET utf8 collate utf8_unicode_ci; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_unicode_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_general_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
所以真正改字符集的时候别忘了加上CONVERT TO,如下:
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci; Query OK, 5 rows affected (0.06 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_unicode_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
要仅仅改变一个表的默认字符集,应使用此语句:
mysql> ALTER TABLE cs default CHARACTER SET utf8 collate utf8_general_ci,ALGORITHM=INPLACE,LOCK=NONE; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_general_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_unicode_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
可以发现列字符集没有改变,并且只有新的列才会默认继承表的字符集(utf8.utf8_general_ci)。
相关推荐:
MySQL表的四种分区类型的代码详解
如何使用mysql表连接
php mysql表中文乱码问题如何解决
# 改了
# 才会
# 什么问题
# 就没
# 四种
# 用在
# 如何解决
# 希望能
# 不支持
# 别忘了
# mysql
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- php8.4匿名类怎么用_php8.4匿名类创建与
- Win10怎样卸载TeamViewer_Win10
- 如何在 ACF 中正确更新嵌套多层的 Group
- Win11如何设置文件关联 Win11修改特定文件
- Windows怎样关闭锁屏广告_Windows关闭
- Win10如何备份驱动程序_Win10驱动备份步骤
- Win10如何更改用户账户控制_Windows10
- Win11怎么设置ipv4地址_Windows 1
- Windows10系统更新错误0x80070002
- 如何用正则表达式精确匹配“start”到“end”
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- php在Linux怎么部署_LNMP环境搭建PHP
- Python对象比较排序规则_集合使用说明【指导】
- PHP主流架构怎么部署到Docker_容器化流程【
- Python网络异常模拟_测试说明【指导】
- Win11怎么更改默认打开方式_Win11关联文件
- c++ namespace命名空间用法_c++避免
- c++如何利用doxygen生成开发文档_c++
- Win10怎么关闭自动更新错误重启 Win10策略
- Win11如何暂停系统更新 Win11暂停更新最长
- 如何提升Golang JSON序列化性能_Gola
- Win11怎么开启远程桌面连接_Windows11
- Windows10无法识别USB设备描述符请求失败
- Win10怎么更改用户名 Win10修改账户名称操
- php中::能访问全局变量吗_全局作用域与类作用域
- Win11怎么关闭通知中心_Windows11系统
- Mac怎么进行语音输入_Mac听写功能设置与使用【
- Win11怎样激活系统密钥_Win11系统密钥激活
- SAX解析器是什么,它与DOM在处理大型XML文件
- Go 语言标准库为何不提供泛型切片的 Contai
- php修改数据怎么批量改状态_批量更新status
- Python数据挖掘进阶教程_分类回归与聚类案例解
- Win11怎么看电池循环次数_Win11笔记本电池
- Windows系统时间服务错误_W32Time服务
- Go 中实现 Python urllib.quot
- Python与GPU加速技术_CUDA与Numba
- Windows10如何更改桌面图标间距_Win10
- Win11怎么开启智能存储_Windows11存储
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- LINUX下如何配置VLAN虚拟局域网_在LINU
- Mac的访达(Finder)怎么用_Mac文件管理
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- Win11怎么设置夜间模式_Windows11显示
- XAMPP 启动失败(Apache 突然停止)的终
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Win10系统怎么查看端口状态_Windows10
- php怎么下载安装后设置默认字符集_utf8配置步
- Windows Defender扫描失败怎么办_安
- PhpStorm怎么调试PHP代码_PhpStor
- Windows10系统怎么查看CPU温度_Win1

_schema.COLUMNS where TABLE_NAME='cs';
+--------------+------------+-------------+-----------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME |
+--------------+------------+-------------+-----------------+
| test | cs | id | NULL |
| test | cs | name | utf8_unicode_ci |
+--------------+------------+-------------+-----------------+
2 rows in set (0.00 sec)
QQ客服