MySQL ORD() 用法与实例

MySQL 中的 ORD() 函数用于返回给定字符串最左侧字符的数值,适用于处理多字节字符和 ASCII 字符。

发布于

MySQL 中的 ORD() 函数是一个处理字符编码的实用工具,它能够返回字符串第一个字符的 Unicode 代码点值。当我们需要了解字符的底层编码表示,或者要基于字符编码进行比较和排序时,这个函数就变得特别有用。想象一下需要检查字符串的起始字符是否在特定编码范围内,或者要创建自定义的排序规则——这些正是 ORD() 函数大显身手的场景。

函数基本语法

使用 ORD() 函数就像查询字符的"身份证号码"一样简单:

ORD(str)

其中 str 是要检查的字符串表达式。对于单字节字符(如 ASCII 字符),函数返回其 ASCII 码值;对于多字节字符,则返回根据其 Unicode 编码计算得到的数值。

基础用法示例

让我们从几个基本例子开始理解 ORD() 的行为:

SELECT ORD('A');
-- 返回结果: 65 (ASCII码中'A'的值)

SELECT ORD('a');
-- 返回结果: 97 (ASCII码中'a'的值)

SELECT ORD('1');
-- 返回结果: 49 (ASCII码中'1'的值)

SELECT ORD('你好');
-- 返回结果: 20320 (中文"你"的Unicode代码点)

处理多字节字符

ORD() 特别适合处理非 ASCII 字符:

SELECT ORD('©');
-- 返回结果: 169 (版权符号的Unicode值)

SELECT ORD('€');
-- 返回结果: 8364 (欧元符号的Unicode值)

SELECT ORD('東京');
-- 返回结果: 26481 (日文"东"字的Unicode值)

与 CHAR()函数的对应关系

ORD()CHAR() 可以看作是一对互逆函数:

SELECT ORD(CHAR(65));
-- 返回结果: 65

SELECT CHAR(ORD('B'));
-- 返回结果: 'B'

这种关系在字符编码转换时特别有用。

在实际查询中的应用

假设我们有一个包含各种符号的产品表:

CREATE TABLE products (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_code VARCHAR(10),
    product_name VARCHAR(100)
);

INSERT INTO products (product_code, product_name) VALUES
('A100', 'Premium Coffee'),
('Ω200', 'Organic Tea'),
('★300', 'Special Edition Gift Set');

我们可以使用 ORD() 来分析产品代码的起始字符:

SELECT
    product_code,
    product_name,
    ORD(product_code) AS first_char_code
FROM products
ORDER BY ORD(product_code);

在条件筛选中的应用

ORD() 在 WHERE 子句中非常实用:

-- 找出产品代码以大写字母开头的产品
SELECT * FROM products
WHERE ORD(product_code) BETWEEN ORD('A') AND ORD('Z');

-- 找出产品代码以特殊符号开头的产品
SELECT * FROM products
WHERE ORD(product_code) > 127;

处理空字符串和 NULL 值

了解 ORD() 在特殊情况下的行为很重要:

SELECT ORD('');
-- 返回结果: 0

SELECT ORD(NULL);
-- 返回结果: NULL

SELECT ORD(' ');
-- 返回结果: 32 (ASCII码中空格的值)

字符编码检测

我们可以利用 ORD() 来检测字符串的编码特征:

SELECT
    product_code,
    CASE
        WHEN ORD(product_code) < 128 THEN 'ASCII'
        WHEN ORD(product_code) BETWEEN 128 AND 255 THEN 'Extended ASCII'
        ELSE 'Unicode'
    END AS encoding_type
FROM products;

性能考虑

虽然 ORD() 非常高效,但在大数据量查询中仍需注意:

  • 对长字符串只检查第一个字符,性能影响有限
  • 在索引列上使用 ORD() 可能导致索引失效
  • 考虑将频繁使用的编码值物化存储可能更高效

与 ASCII()函数的区别

ORD()ASCII() 相似但有重要区别:

SELECT ASCII('€'), ORD('€');
-- 返回结果: 226 | 8364

ASCII() 只返回第一个字节的值,而 ORD() 返回完整的 Unicode 代码点。

总结

MySQL 的 ORD() 函数为我们提供了深入了解字符编码的能力。通过本文,我们学会了如何获取字符的 Unicode 代码点,如何处理各种字符类型,以及如何在实际查询中应用这个函数。无论是进行字符编码分析、创建自定义排序规则,还是实现特殊的筛选条件,ORD() 都能提供底层字符处理的能力。虽然大多数日常开发可能不需要直接操作字符编码,但在处理国际化应用、特殊符号或需要精确字符控制的场景时,理解和使用 ORD() 函数将成为一个强大的工具。掌握这个函数可以帮助开发者解决一些特殊的字符串处理需求,使我们的数据库操作更加灵活和强大。