Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

यूटीएफ समकक्षों के साथ MySQL स्थानापन्न html विशेष वर्ण

जैसा कि मेरी टिप्पणी में बताया गया है , यह बहुत अस्पष्ट है कि आप अपने मामले में क्या करने का प्रयास कर रहे हैं।

पूर्ण रूप से हाँ। आप वर्ण कोड निकायों को बदल सकते हैं (उदा. { और ƫ ) "मैपिंग" में वर्ण कोड को देखे बिना उनके प्रतिस्थापन वर्णों के साथ। लेकिन नामित इकाइयां (उदा. " ) को हमेशा ऊपर देखने की आवश्यकता होगी।

यहाँ सामान्य मामले को हल करने का मेरा प्रयास है:

  1. HTML में परिभाषित नामित वर्ण निकायों को संग्रहीत करने के लिए एक तालिका बनाएं:

    CREATE TABLE ents (
      ref VARCHAR(8) NOT NULL COLLATE utf8_bin,
      rep CHAR(1)    NOT NULL,
      PRIMARY KEY (ref)
    );
    
  2. इस तालिका को पॉप्युलेट करें - मैं एक स्क्रिप्ट का उपयोग करने का सुझाव देता हूं, उदाहरण के लिए 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. इकाई प्रतिस्थापन करने के लिए SQL फ़ंक्शन को परिभाषित करें (जहां लागू हो, या वर्ण कोड द्वारा इस तालिका का उपयोग करके):

    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. इस फ़ंक्शन को दो बार लागू करें अपनी (जाहिरा तौर पर) डबल-एन्कोडेड तालिका को डीकोड करने के लिए:

    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. PHP में SQL परिणामों के माध्यम से लूपिंग - संपूर्ण सरणी नहीं मिल रही है

  2. पीडीओ का उपयोग करके PHP में एक MySQL डेटाबेस तालिका को कैसे प्रिंट करें

  3. देखें कि क्या mysql . का उपयोग करके बहुभुज के भीतर अक्षांश/लंबा गिर जाता है

  4. SQL त्रुटि मैं इसे समझ नहीं सकता

  5. कोडइग्निटर:WHERE क्लॉज और OR क्लॉज का उपयोग कैसे करें