SQLで文字列の長さを取得するLENGTH関数とCHARLENGTH関数の使い方

SQLで文字列の長さを取得する方法について、各データベース別の関数の違いや使い方を解説します。LENGTH関数とCHARLENGTH関数の違いって何なのでしょうか?

SQLで文字列の長さを取得する方法

文字列の長さを取得する主な関数
📏
LENGTH関数

バイト単位で文字列の長さを取得する標準的な関数

📊
CHAR_LENGTH関数

文字数単位で長さを取得する関数(マルチバイト文字に対応)

🔄
データベース別の違い

各データベース製品で使用できる関数が異なります

SQLの文字列長さ取得関数の基本

文字列の長さを取得する関数は、データベース製品によって異なります。主な関数の対応は以下の通りです:

データベース 使用可能な関数
MySQL LENGTH, CHAR_LENGTH
PostgreSQL LENGTH, CHAR_LENGTH
Oracle LENGTH
SQL Server LEN
Access LEN

 

基本的な使い方を見てみましょう:


-- LENGTH関数の基本的な使い方
SELECT LENGTH('Hello World') 
-- カラムに対する使用例
SELECT product_name, LENGTH(product_name) AS name_length 
FROM products

LENGTH関数とCHAR_LENGTH関数の違い

LENGTH関数とCHAR_LENGTH関数には重要な違いがあります:

  1. LENGTH関数
  • バイト単位で長さを計算
  • マルチバイト文字は複数バイトとしてカウント
  • 主にデータのストレージサイズを知りたい場合に使用
  1. CHAR_LENGTH関数
  • 文字数単位で長さを計算
  • マルチバイト文字も1文字としてカウント
  • 実際の表示文字数を知りたい場合に使用

 

例えば以下のような違いが出ます:


SELECT 
  '漢字' AS text,
  LENGTH('漢字') AS byte_length,    -- 6(3バイト×2文字)
  CHAR_LENGTH('漢字') AS char_length -- 2(2文字)
FROM dual

SQLで文字列長さを条件にした検索方法

文字列の長さを条件にしてデータを検索する方法をご紹介します:


-- 5文字以上の商品名を検索
SELECT product_name 
FROM products 
WHERE LENGTH(product_name) >= 5
-- 文字数でグループ化して集計
SELECT 
  CHAR_LENGTH(product_name) AS name_length,
  COUNT(*) AS product_count
FROM products 
GROUP BY CHAR_LENGTH(product_name)

SQLの文字列長さ関数のパフォーマンス最適化

文字列長さ関数を使用する際のパフォーマンスについて考慮すべき点があります:

  1. インデックスの活用
  • LENGTH関数を使用した条件はインデックスを活用できない
  • 可能な限り他の条件と組み合わせて検索範囲を絞る
  1. 処理の最適化
    
    -- 非効率な例
    SELECT * FROM products WHERE LENGTH(name) = 5
    -- 最適化した例
    SELECT * FROM products 
    WHERE name LIKE '_____'  -- 5文字を示すアンダースコア
      AND LENGTH(name) = 5
    

SQLの文字列長さ関数の応用テクニック

文字列長さ関数を使った実践的な応用例をご紹介します:

  1. パスワードの長さチェック
    
    CREATE TABLE users (
      id INT PRIMARY KEY,
      username VARCHAR(50),
      password VARCHAR(100),
      CONSTRAINT chk_password_length 
      CHECK (LENGTH(password) >= 8)
    )
    
  2. 文字数による分類
    
    SELECT 
      CASE 
        WHEN CHAR_LENGTH(description) <= 50 THEN '短い説明'
        WHEN CHAR_LENGTH(description) <= 100 THEN '標準的な説明'
        ELSE '長い説明'
      END AS description_type,
      COUNT(*) AS count
    FROM products
    GROUP BY 
      CASE 
        WHEN CHAR_LENGTH(description) <= 50 THEN '短い説明'
        WHEN CHAR_LENGTH(description) <= 100 THEN '標準的な説明'
        ELSE '長い説明'
      END
    
  3. 文字列の切り詰め
    
    -- 長すぎる商品名を20文字で切り詰める
    SELECT 
      CASE 
        WHEN CHAR_LENGTH(product_name) > 20 
        THEN CONCAT(LEFT(product_name, 17), '...')
        ELSE product_name
      END AS truncated_name
    FROM products