Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql thay thế các ký tự đặc biệt html bằng các ký tự tương đương UTF

Như đã đề cập trong nhận xét của tôi ở trên , không rõ bạn đang cố gắng làm gì trong trường hợp của mình.

Vâng, vâng. Bạn có thể thay thế các thực thể mã ký tự (ví dụ:{ƫ ) với các ký tự thay thế của chúng mà không cần phải tra cứu mã ký tự trong "ánh xạ". Nhưng các thực thể được đặt tên (ví dụ:" ) sẽ luôn cần được tra cứu.

Đây là nỗ lực của tôi để giải quyết trường hợp chung:

  1. Tạo một bảng để lưu trữ các thực thể ký tự được đặt tên được xác định trong HTML:

    CREATE TABLE ents (
      ref VARCHAR(8) NOT NULL COLLATE utf8_bin,
      rep CHAR(1)    NOT NULL,
      PRIMARY KEY (ref)
    );
    
  2. Điền vào bảng này - tôi khuyên bạn nên sử dụng một tập lệnh, ví dụ như từ PHP:

    $dbh = new PDO("mysql:dbname=$dbname", $username, $password);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE);
    $ins = $dbh->prepare('INSERT INTO ents (ref, rep) VALUES (?, ?)');
    $t = get_html_translation_table(HTML_ENTITIES);
    foreach ($t as $k => $v) $ins->execute([substr($v, 1, -1), $k]);
    
  3. Xác định một hàm SQL để thực hiện thay thế thực thể (sử dụng bảng này nếu có, hoặc bằng mã ký tự khác):

    DELIMITER ;;
    
    CREATE FUNCTION dhe(s TEXT) RETURNS TEXT
    BEGIN
      DECLARE n, p, i, t INT DEFAULT 0;
      DECLARE r VARCHAR(12);
      entity_search: LOOP
        SET n := LOCATE('&', s, n+1);
        IF (!n) THEN
          LEAVE entity_search;
        END IF;
    
        IF (SUBSTRING(s, n+1, 1) = '#') THEN
          CASE
            WHEN SUBSTRING(s, n+2, 1) RLIKE '[[:digit:]]' THEN
              SET t := 2, p := n+2, r := '[[:digit:]]';
            WHEN SUBSTRING(s, n+2, 1) = 'x' THEN
              SET t := 3, p := n+3, r := '[[:xdigit:]]';
            ELSE ITERATE entity_search;
          END CASE;
        ELSE
          SET t := 1, p := n+1, r := '[[:alnum:]_]';
        END IF;
    
        SET i := 0;
        reference: LOOP
          IF SUBSTRING(s, p+i, 1) NOT RLIKE r THEN
            IF SUBSTRING(s, p+i, 1) RLIKE '[[:alnum:]_]' THEN
              ITERATE entity_search;
            END IF;
            LEAVE reference;
          END IF;
          IF i = 8 THEN ITERATE entity_search; END IF;
          SET i := i + 1;
        END LOOP reference;
    
        SET s := CONCAT(
          LEFT(s, n-1),
          CASE t
            WHEN 1 THEN COALESCE(
              (SELECT rep FROM ents WHERE ref = SUBSTRING(s, p, i))
            , SUBSTRING(s, n, i + IF(SUBSTRING(s, p+i, 1)=';',1,0))
            )
            WHEN 2 THEN CHAR(SUBSTRING(s, p, i))
            WHEN 3 THEN CHAR(CONV(SUBSTRING(s, p, i), 16, 10))
          END,
          SUBSTRING(s, p + i + IF(SUBSTRING(s, p+i, 1)=';',1,0))
        );
      END LOOP entity_search;
      RETURN s;
    END;;
    
    DELIMITER ;
    
  4. Áp dụng chức năng này hai lần để giải mã bảng được mã hóa kép (dường như) của bạn:

    UPDATE my_table SET my_column = dhe(dhe(my_column));
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập MySQL 5.7.12 không thể tạo giá trị JSON từ một chuỗi có CHARACTER SET 'nhị phân'

  2. Sequel Pro với Mysql trong Docker

  3. SQLAlchemy JSON dưới dạng blob / text

  4. TẠO BẢNG MySQL và T-SQL với các ví dụ về cú pháp

  5. Làm cách nào để kết nối ứng dụng Android với cơ sở dữ liệu MySQL?