Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql zastępuje znaki specjalne html odpowiednikami UTF

Jak wspomniano w mój komentarz powyżej , jest strasznie niejasne, co próbujesz zrobić we własnym przypadku.

No tak. Możesz zastąpić encje kodu znaków (np. { i ƫ ) z ich znakami zastępczymi bez konieczności wyszukiwania kodu znaku w „mapowaniu”. Ale nazwane encje (np. " ) zawsze trzeba będzie sprawdzić.

Oto moja próba rozwiązania ogólnego przypadku:

  1. Utwórz tabelę do przechowywania nazwanych jednostek znakowych zdefiniowanych w HTML:

    CREATE TABLE ents (
      ref VARCHAR(8) NOT NULL COLLATE utf8_bin,
      rep CHAR(1)    NOT NULL,
      PRIMARY KEY (ref)
    );
    
  2. Wypełnij tę tabelę - sugeruję użycie skryptu, na przykład z 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. Zdefiniuj funkcję SQL do wykonywania zamiany encji (w stosownych przypadkach używając tej tabeli lub kodu znaków):

    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. Zastosuj tę funkcję dwa razy aby zdekodować (podobno) podwójnie zakodowaną tabelę:

    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. MySQL konwertuje stopnie, minuty, sekundy na stopień dziesiętny

  2. Co to jest PyMySQL i czym różni się od MySQLdb? Czy może to wpłynąć na wdrożenie Django?

  3. gem mysql2 skompilowany dla niewłaściwej biblioteki klienta mysql

  4. Jak zaimportować plik Excel do bazy danych mysql z PHP

  5. MySQL - sortuj ciąg znaków oddzielonych przecinkami w kolumnie