GVKun编程网logo

在MySQL中检测utf8损坏的字符(检测mysql字符的语句)

22

对于在MySQL中检测utf8损坏的字符感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解检测mysql字符的语句,并且为您提供关于MySQL8.0:字符集从utf8转换成utf8mb4的迁移

对于在MySQL中检测utf8损坏的字符感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解检测mysql字符的语句,并且为您提供关于MySQL 8.0:字符集从 utf8 转换成 utf8mb4的迁移方法【转】、MySQL 中的 utf8mb4 和 utf8 字符集有什么区别?、MySQL 数据库字符集 utf8 和 utf8mb4 的区别、MySQL中utf8mb4和utf8字符集有什么区别?的宝贵知识。

本文目录一览:

在MySQL中检测utf8损坏的字符(检测mysql字符的语句)

在MySQL中检测utf8损坏的字符(检测mysql字符的语句)

我有一个数据库,其中有一堆破碎的utf8字符散布在几个表上。字符列表不是很广泛的AFAIK(áéíúóÁÉÍÓÓÚÑñ)

修复给定的表非常简单

update orderItem set itemName=replace(itemName,''á'',''á'');

但是我无法检测到损坏的字符。如果我做类似的事情

SELECT * FROM TABLE WHERE field LIKE "%Ã%";

由于排序规则(Ã= a),我几乎获得了所有字段。到目前为止,所有损坏的字符均以“Ô开头。数据库是西班牙语,因此不使用此特定字符

到目前为止,我得到的损坏字符列表是

á = áé = éí- = íó = óñ = ñá = Á

是否知道如何使此SELECT正常工作?(二进制搜索或类似的东西)

答案1

小编典典

如何使用另一种方法,即来回转换列以获取正确的字符集呢?您可以将其转换为二进制,然后转换为utf-8,然后转换为iso-8859-1或您使用的任何其他格式。有关详细信息,请参见手册。

MySQL 8.0:字符集从 utf8 转换成 utf8mb4的迁移方法【转】

MySQL 8.0:字符集从 utf8 转换成 utf8mb4的迁移方法【转】

整理 MySQL 8.0 文档时发现一个变更:

默认字符集由 latin1 变为 utf8mb4。想起以前整理过字符集转换文档,升级到 MySQL 8.0 后大概率会有字符集转换的需求,在此正好分享一下。

当时的需求背景是:

部分系统使用的字符集是 utf8,但 utf8 最多只能存 3 字节长度的字符,不能存放 4 字节的生僻字或者表情符号,因此打算迁移到 utf8mb4。

迁移方案一

1. 准备新的数据库实例,修改以下参数:

    [mysqld]

    ## Character Settings

    init_connect=''SET NAMES utf8mb4''

    #连接建立时执行设置的语句,对super权限用户无效

    character-set-server = utf8mb4

    collation-server = utf8mb4_general_ci

    #设置服务端校验规则,如果字符串需要区分大小写,设置为utf8mb4_bin

    skip-character-set-client-handshake

    #忽略应用连接自己设置的字符编码,保持与全局设置一致

    ## Innodb Settings

    innodb_file_format = Barracuda

    innodb_file_format_max = Barracuda

    innodb_file_per_table = 1

    innodb_large_prefix = ON

    #允许索引的最大字节数为3072(不开启则最大为767字节,对于类似varchar(255)字段的索引会有问题,因为255*4大于767)

 

 

 

2. 停止应用,观察,确认不再有数据写入

可通过 show master status 观察 GTID 或者 binlog position,没有变化则没有写入。

3. 导出数据

先导出表结构:

 

mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql

 

 

 

后导出数据:

 

mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --database testdb > /backup/testdata.sql

 

 

 

4. 修改建表语句

修改导出的表结构文件,将表、列定义中的 utf8 改为 utf8mb4

5. 导入数据

先导入表结构:

 

mysql -u -p testdb < /backup/testdb.sql

 

 

 

后导入数据:

 

mysql -u -p testdb < /backup/testdata.sql

 

 

 

6. 建用户

查出旧环境的数据库用户,在新数据库中创建

7. 修改新数据库端口,启动应用进行测试

关闭旧数据库,修改新数据库端口重启,启动应用

迁移方案二

1. 修改表的字符编码会锁表,建议先停止应用

2. 停止 mysql,备份数据目录(也可以其他方式进行全备)

3. 修改配置文件,重启数据库

 

    [mysqld]

    ## Character Settings

    init_connect=''SET NAMES utf8mb4''

    #连接建立时执行设置的语句,对super权限用户无效

    character-set-server = utf8mb4

    collation-server = utf8mb4_general_ci

    #设置服务端校验规则,如果字符串需要区分大小写,设置为utf8mb4_bin

    skip-character-set-client-handshake

    #忽略应用连接自己设置的字符编码,保持与全局设置一致

    ## Innodb Settings

    innodb_file_format = Barracuda

    innodb_file_format_max = Barracuda

    innodb_file_per_table = 1

    innodb_large_prefix = ON

    #允许索引的最大字节数为3072(不开启则最大为767字节,对于类似varchar(255) 字段的索引会有问题,因为255*4大于767)

 

 

 

4. 查看所有表结构,包括字段、修改库和表结构,如果字段有定义字符编码,也需要修改字段属性,sql 语句如下:修改表的字符集:

 

alter table t convert to character set utf8mb4;

 

 

 

影响:拷贝全表,速度慢,会加锁,阻塞写操作

修改字段的字符集(utf8mb4 每字符占 4 字节,注意字段类型的最大字节数与字符长度关系):

 

alter table t modify a char CHARACTER SET utf8mb4;

 

 

 

影响:拷贝全表,速度慢,会加锁,阻塞写操作

修改 database 的字符集:

 

alter database sbtest CHARACTER SET utf8mb4;

 

 

 

影响:只需修改元数据,速度很快

5. 修改 JDBC url characterEncoding=utf-8

 

转自

知数堂-技术分享 | MySQL 8.0:字符集从 utf8 转换成 utf8mb4 https://mp.weixin.qq.com/s/p-aooa7WRDSPK6wCaqVy6w

MySQL 中的 utf8mb4 和 utf8 字符集有什么区别?

MySQL 中的 utf8mb4 和 utf8 字符集有什么区别?

MySQLutf8mb4utf8charsets 有什么区别? __

我已经知道 ASCIIUTF-8UTF-16UTF-32 编码;但我很想知道编码组与 MySQL
Server
utf8mb4中定义的其他编码类型有什么区别。 __

utf8mb4 使用而不是有什么特殊的好处/建议utf8吗?

答案1

小编典典

UTF-8是一种可变长度编码。对于
UTF-8,这意味着存储一个代码点需要一到四个字节。但是,MySQL 的编码称为“utf8”(“utf8mb3”的别名)每个代码点最多只能存储三个字节。

所以字符集“utf8”/“utf8mb3”不能存储所有的Unicode码位:它只支持0x000到0xFFFF的范围,被称为“基本多语言平面”。另请参阅Unicode
编码比较。

这是MySQL 文档必须说的(同一页面的先前版本) :

名为 utf8[/utf8mb3] 的字符集每个字符最多使用三个字节,并且仅包含 BMP 字符。从 MySQL 5.5.3 开始,utf8mb4
字符集每个字符最多使用四个字节,支持补充字符:

  • 对于 BMP 字符,utf8[/utf8mb3] 和 utf8mb4 具有相同的存储特性:相同的代码值、相同的编码、相同的长度。

  • 对于补充字符, utf8[/utf8mb3] 根本无法存储该字符 ,而 utf8mb4 需要四个字节来存储它。由于
    utf8[/utf8mb3] 根本无法存储字符,因此您在 utf8[/utf8mb3] 列中没有任何补充字符,您不必担心从旧版本升级
    utf8[/utf8mb3] 数据时转换字符或丢失数据mysql。

因此,如果您希望您的列支持存储位于 BMP
之外的字符(并且您通常想要),例如emoji,请使用“utf8mb4”。另请参阅实际使用中最常见的非
BMP Unicode 字符是什么?.

MySQL 数据库字符集 utf8 和 utf8mb4 的区别

MySQL 数据库字符集 utf8 和 utf8mb4 的区别

参考于今日头条上Java芋道源码的-----记住:永远不要在 MySQL 中使用 UTF-8

字符集选择

MySQL 的 utf8 实际上不是真正的 UTF-8。utf8 只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。

MySQL 一直没有修复这个 bug,他们在 2010 年发布了一个叫作 utf8mb4 的字符集,绕过了这个问题。当然,他们并没有对新的字符集广而告之(可能是因为这个 bug 让他们觉得很尴尬),以致于现在网络上仍然在建议开发者使用 utf8,但这些建议都是错误的。

简单概括如下:

(1)MySQL 的 utf8mb4 是真正的 UTF-8。

(2)MySQL 的 utf8 是一种专属的编码,它能够编码的 Unicode 字符并不多。

所有在使用 utf8 的 MySQL 和 MariaDB 用户都应该改用 utf8mb4,永远都不要再使用 utf8。

这里(https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4)提供了一个指南用于将现有数据库的字符编码从 utf8 转成 utf8mb4。

历史原因

为什么 MySQL 开发者会让“utf8”失效?我们或许可以从提交日志中寻找答案。

MySQL 从 4.1 版本开始支持 UTF-8,也就是 2003 年,而今天使用的 UTF-8 标准(RFC 3629)是随后才出现的。

旧版的 UTF-8 标准(RFC 2279)最多支持每个字符 6 个字节。2002 年 3 月 28 日,MySQL 开发者在第一个 MySQL 4.1 预览版中使用了 RFC 2279。

同年 9 月,他们对 MySQL 源代码进行了一次调整:“UTF8 现在最多只支持 3 个字节的序列”。

是谁提交了这些代码?他为什么要这样做?这个问题不得而知。在迁移到 Git 后(MySQL 最开始使用的是 BitKeeper),MySQL 代码库中的很多提交者的名字都丢失了。2003 年 9 月的邮件列表中也找不到可以解释这一变更的线索。

不过我可以试着猜测一下。

2002 年,MySQL 做出了一个决定:如果用户可以保证数据表的每一行都使用相同的字节数,那么 MySQL 就可以在性能方面来一个大提升。为此,用户需要将文本列定义为“CHAR”,每个“CHAR”列总是拥有相同数量的字符。如果插入的字符少于定义的数量,MySQL 就会在后面填充空格,如果插入的字符超过了定义的数量,后面超出部分会被截断。

MySQL 开发者在最开始尝试 UTF-8 时使用了每个字符 6 个字节,CHAR(1) 使用 6 个字节,CHAR(2) 使用 12 个字节,并以此类推。

应该说,他们最初的行为才是正确的,可惜这一版本一直没有发布。但是文档上却这么写了,而且广为流传,所有了解 UTF-8 的人都认同文档里写的东西。

不过很显然,MySQL 开发者或厂商担心会有用户做这两件事:

(1)使用 CHAR 定义列(在现在看来,CHAR 已经是老古董了,但在那时,在 MySQL 中使用 CHAR 会更快,不过从 2005 年以后就不是这样子了)。

(2)将 CHAR 列的编码设置为“utf8”。

我的猜测是 MySQL 开发者本来想帮助那些希望在空间和速度上双赢的用户,但他们搞砸了“utf8”编码。

所以结果就是没有赢家。那些希望在空间和速度上双赢的用户,当他们在使用“utf8”的 CHAR 列时,实际上使用的空间比预期的更大,速度也比预期的慢。而想要正确性的用户,当他们使用“utf8”编码时,却无法保存像“”这样的字符。

在这个不合法的字符集发布了之后,MySQL 就无法修复它,因为这样需要要求所有用户重新构建他们的数据库。最终,MySQL 在 2010 年重新发布了“utf8mb4”来支持真正的 UTF-8。

MySQL中utf8mb4和utf8字符集有什么区别?

MySQL中utf8mb4和utf8字符集有什么区别?

utf8mb4MySQL中的utf8字符集有什么区别? __

我已经知道 ASCIIUTF-8UTF-16UTF-32 编码;但是我很好奇知道utf8mb4编码组与 MySQL
Server中
定义的其他编码类型有什么区别。

使用utf8mb4而不是有什么特别的好处/提议utf8吗?

我们今天的关于在MySQL中检测utf8损坏的字符检测mysql字符的语句的分享已经告一段落,感谢您的关注,如果您想了解更多关于MySQL 8.0:字符集从 utf8 转换成 utf8mb4的迁移方法【转】、MySQL 中的 utf8mb4 和 utf8 字符集有什么区别?、MySQL 数据库字符集 utf8 和 utf8mb4 的区别、MySQL中utf8mb4和utf8字符集有什么区别?的相关信息,请在本站查询。

本文标签: