首页 > 数据库 >27. 使用MySQL之全球化和本地化

27. 使用MySQL之全球化和本地化

时间:2024-11-15 19:18:21浏览次数:1  
标签:CONVERT 27 转换 本地化 字符集 CAST MySQL 校对 SELECT

1. 字符集和校对顺序

数据库表被用来存储和检索数据。不同的语言和字符集需要以不同的方式存储和检索。因此,MySQL需要适应不同的字符集(不同的字母和字符),适应不同的排序和检索数据的方法。

在讨论多种语言和字符集时,将会遇到以下重要术语:

  • 字符集为字母和符号的集合;

  • 编码为某个字符集成员的内部表示;

  • 校对为规定字符如何比较的指令。

补充:

  • 校对为什么重要:

    排序英文正文很容易,对吗?或许不。考虑词APE、apex和Apple。它们处于正确的排序顺序吗?这有赖于你是否想区分大小写。使用区分大小写的校对顺序,这些词有一种排序方式,使用不区分大小写的校对顺序有另外一种排序方式。这不仅影响排序(如用ORDER BY排序数据),还影响搜索(例如,寻找apple的WHERE子句是否能找到APPLE)。在使用诸如法文à或德文ö这样的字符时,情况更复杂,在使用不基于拉丁文的字符集(日文、希伯来文、俄文等)时,情况更为复杂。

在MySQL的正常数据库活动(SELECT、INSERT等)中,不需要操心太多的东西。使用何种字符集和校对的决定在服务器、数据库和表级进行。

2. 使用字符集和校对顺序

MySQL支持众多的字符集。

  • 为查看所支持的字符集完整列表,使用以下语句:

    show character set;
    

    输出如下(未截全):

    img

    这条语句显示所有可用的字符集以及每个字符集的描述和默认校对。

  • 为了查看所支持校对的完整列表,使用以下语句:

    show collation;
    

    输出如下(未截全):

    img

    此语句显示所有可用的校对,以及它们适用的字符集。可以看到有的字符集具有不止一种校对。例如,latin1对不同的欧洲语言有几种校对,而且许多校对出现两次,一次区分大小写(由_cs表示),一次不区分大小写(由_ci表示)。

  • 通常系统管理在安装时定义一个默认的字符集和校对。此外,也可以在创建数据库时,指定默认的字符集和校对。为了确定所用的字符集和校对,可以使用以下语句:

    show variables like 'character%';
    show variables like 'collation%';
    

    输出如下:

    img

    img

  • 实际上,字符集很少是服务器范围(甚至数据库范围)的设置。不同的表,甚至不同的列都可能需要不同的字符集,而且两者都可以在创建表时指定。

    为了给表指定字符集和校对,可使用带子句的CREATE TABLE:

    create table mytable
    (
        column1 int,
        column2 varchar(10)
    )default character set hebrew
    collate hebrew_general_ci;
    

    此语句创建一个包含两列的表,并且指定一个字符集和一个校对顺序。

    这个例子中指定了CHARACTER SET和COLLATE两者。一般,MySQL按如下确定使用什么样的字符集和校对。

    • 如果指定CHARACTER SET和COLLATE两者,则使用这些值。

    • 如果只指定CHARACTER SET,则使用此字符集及其默认的校对(如SHOW CHARACTER SET的结果中所示)。

    • 如果既不指定CHARACTER SET,也不指定COLLATE,则使用数据库默认。

  • 除了能指定字符集和校对的表范围外,MySQL还允许对每个列设置它们,如下所示:

    create table mytable1
    (
        column1 int,
        colume2 varchar(10),
        column3 varchar(10) character set latin1 collate latin1_general_ci
    )default character set hebrew
    collate hebrew_general_ci;
    

    这里对整个表以及一个特定的列指定了CHARACTER SET和COLLATE。

  • 如前所述,校对在对用ORDER BY子句检索出来的数据排序时起重要的作用。如果你需要用与创建表时不同的校对顺序排序特定的SELECT语句,可以在SELECT语句自身中进行:

    select * from customers
    order by cust_name collate latin1_general_cs;
    

    此SELECT使用COLLATE指定一个备用的校对顺序(在这个例子中,为区分大小写的校对)。这显然将会影响到结果排序的次序。

    插一句题外话

    试了一下上面的select语句,结果报错

    img

    回归正题

    补充:

    • 临时区分大小写:

      上面的SELECT语句演示了在通常不区分大小写的表上进行区分大小写搜索的一种技术。当然,反过来也是可以的

    • SELECT的其他COLLATE子句:

      除了这里看到的在ORDER BY子句中使用以外,COLLATE还可以用于GROUP BY、HAVING、聚集函数、别名等。

  • 最后,值得注意的是,如果绝对需要,串可以在字符集之间进行转换。为此,使用Cast()Convert()函数。

插句题外话

  1. CAST() 函数

    CAST() 是 MySQL 中用于显式转换数据类型的函数。它可以将一个表达式(比如一个列值或常量)从一种数据类型转换为另一种数据类型。

    语法:

    CAST(expression AS target_data_type)
    
    • expression:表示需要转换的数据或表达式,通常是列名、常量值等。

    • target_data_type:目标数据类型,是要将 expression 转换成的类型。常见的目标数据类型包括 SIGNED(带符号整数)、UNSIGNED(无符号整数)、CHAR、DATE、DATETIME、DECIMAL 等。

    常见的目标数据类型:

    • SIGNED:转换为有符号整数类型。

    • UNSIGNED:转换为无符号整数类型。

    • CHAR、VARCHAR:转换为字符类型(可以指定长度)。

    • BINARY、VARBINARY:转换为二进制数据类型。

    • DATE、DATETIME:转换为日期或日期时间类型。

    • DECIMAL、FLOAT、DOUBLE:转换为数字类型。

    举几个例子:

    1. 将字符串转换为整数:

      SELECT CAST('123' AS UNSIGNED);
      

      这个查询会将字符串 '123' 转换为无符号整数 123。

    2. 将浮点数转换为整数:

      SELECT CAST(123.45 AS SIGNED);
      

      这个查询会将浮点数 123.45 转换为带符号整数 123。

    3. 将数字转换为字符串:

      SELECT CAST(123 AS CHAR);
      

      这个查询会将整数 123 转换为字符串 '123'。

    4. 将日期字符串转换为 DATE 类型:

      SELECT CAST('2024-12-01' AS DATE);
      

      这个查询会将字符串 '2024-12-01' 转换为 DATE 类型。

    特点:

    • CAST() 主要用于数据类型之间的转换,不支持字符集转换。

    • 语法简洁,常用于将一个数据类型转换为另一个类型,尤其是在进行数值计算或数据格式调整时。

    • 对于日期、时间和字符数据类型的转换,CAST() 会自动进行格式化处理。

  2. CONVERT() 函数

    CONVERT() 是一个功能更强大的函数,不仅支持数据类型转换,还支持字符集转换。它可以用于将一个值从一种数据类型转换为另一种数据类型,或在字符集之间进行转换。

    语法:

    CONVERT(expression, target_data_type)
    

    或者

    CONVERT(expression USING target_charset)
    
    • expression:表示需要转换的数据或表达式,通常是列名、常量值等。

    • target_data_type:目标数据类型,和 CAST() 类似,可以是 SIGNED、CHAR、DATE 等。

    • target_charset:目标字符集,只在字符集转换时使用,例如 utf8、latin1 等。

    举几个例子:

    1. 将字符串转换为整数:

      SELECT CONVERT('123' SIGNED);
      

      这个查询会将字符串 '123' 转换为带符号整数 123。

    2. 将浮点数转换为字符串:

      SELECT CONVERT(123.45, CHAR);
      

      这个查询会将浮点数 123.45 转换为字符串 '123.45'。

    3. 将字符串从一个字符集转换为另一个字符集:

      SELECT CONVERT('你好' USING latin1);
      

      这个查询会将字符串 '你好' 从 UTF-8 编码转换为 latin1 编码,可能会导致字符丢失或乱码,因为 latin1 不能表示所有的 Unicode 字符。

    4. 将字段值转换为不同的字符集:

      SELECT CONVERT(name USING utf8) FROM users;
      

      这个查询将 users 表中的 name 字段值从当前字符集转换为 utf8 字符集。

    特点:

    • CONVERT() 函数不仅支持数据类型转换,还可以进行字符集转换,尤其适用于需要转换字符串编码时。

    • 在处理字符集转换时,CONVERT() 会尝试将字符串中的字符从一个字符集映射到另一个字符集。如果目标字符集无法表示某些字符,可能会丢失或出现乱码。

    • CONVERT() 在字符集转换时,可以在 USING 子句中指定目标字符集,支持的字符集包括 utf8、latin1、gbk 等。

    对比:

    • CAST() 只支持数据类型转换,而不支持字符集转换。

    • CONVERT() 不仅可以进行数据类型转换,还可以在字符集之间转换。

标签:CONVERT,27,转换,本地化,字符集,CAST,MySQL,校对,SELECT
From: https://www.cnblogs.com/hisun9/p/18548535

相关文章

  • MySQL:CRUD
    MySQL表的增删改查(操作的是表中的记录)CRUD(增删改查)C-Create新增R-Retrieve检查,查询U-Update更新D-Delete删除新增(Create)语法:单行数据+全列插入 insertinto表名[字段一,字段二]values(值一,值二); 通过看表的结果,我们可以看出内容已经写好注:列和值的数据类型一定要......
  • MySQL:数据库的约束
    约束类型NOTNULL-指示某列不能存储NULL值。UNIQUE-保证某列的每行必须有唯一的值。DEFAULT-规定没有给列赋值时的默认值。PRIMARYKEY-NOTNULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。FOREI......
  • 深入理解 MySQL 大小写敏感性:配置、问题与实践指南20241115
    深入理解MySQL大小写敏感性:配置、问题与实践指南在开发和部署MySQL数据库时,表名的大小写敏感性问题常常被忽略,却可能在跨平台迁移、团队协作或工具兼容性方面引发复杂的故障。本文将结合实际案例,深入探讨MySQL的lower_case_table_names参数,剖析其行为、配置方法以......
  • 【MySQL的安装与配置】
    目录:一、下载MySQL二、安装MySQL三、配置环境变量一、下载MySQL进入官方下载页面:https://www.mysql.com/downloads二、安装MySQL双击运行下载好的安装程序 三、配置环境变量此部分操作的目的就是方便咱们通过命令行在任何位置都可以......
  • 记一次react+node+nginx+mysql+docker发布
    简言这是为了给老婆工作上算培训班课时,计算课销更方便点的CRM(纸质档转线上)准备工作React项目Node项目(express,koa任意选择)一台服务器(如果你是纯手工发布,服务器选择倒是无所谓,如果要结合docker的话,请选择国外服务器或者香港也行,阿里云就算了,我自己最开始用的阿里云,docker根本p......
  • 力扣-Mysql-3293-计算产品最终价格(中等)
    一、题目来源3293.计算产品最终价格-力扣(LeetCode)二、数据表结构表:Products+------------+---------+|ColumnName|Type|+------------+---------+|product_id|int||category|varchar||price|decimal|+------------+-------......
  • 通过情况数据目录初始化MySQL数据库
    第一步:cd/etc/my.cnf打开配置文件,查看当前数据库的数据目录datadir打开datadir路径,备份所有文件到另外的目录然后删除所有rm -rf*初始化数据库mysqld--defaults-file=/etc/my.cnf--initialize-insecure然后datadir路径下会产生新的数据文件,给所有文件,包括文件夹下面......
  • P11276 第一首歌 题解
    P11276第一首歌题解一道简单的字符串题目。题目解释说求一个最短的字符串\(t\),使其满足对于给定的字符串\(s\):\(s\)为\(t\)的前缀。\(s\)为\(t\)的后缀。\(s\)不为\(t\)。仔细思考一下,则易得\(t\)的最短长度的最大值为\(s\)的两倍。即当\(s\)......
  • MySQL 8 复制性能的增强
     新的复制时间戳MySQL主从复制环境,最常见的任务是确保复制确实在进行,而且主从之间没有发生错误。常用的命令是showslavestatus,该命令提供了从库线程的状态信息。因此,通常需要每个从库上执行showslavestatus并检查输出结果。 输出内容中,有个参数指标"Seconds_Behind_M......
  • mysql使用KILL命令来终止特定的查询进程
    在MySQL中,有时可能需要终止一个正在运行的查询进程,特别是当该进程占用了过多的资源或由于某种原因卡住了。可以使用KILL命令来终止特定的查询进程。以下是具体的步骤和注意事项:1.查看活动进程找到想要终止的进程ID。可以使用以下查询来查看当前所有的MySQL活动进程:SH......